题目地址:
Problem - D - Codeforceshttps://codeforces.com/contest/1758/problem/D
题意:
给你一个数字n,你需要构建出一个大小为n的数组,使得max(a1,a2,...an)-min(a1,a2...an)=,这个必须是一个完全平方数,并不是强制转化为int类型的。
思路:
这个题可以分成是两种情况(n为奇数和偶数来考虑):
第一种:偶数的话,直接利用n个数的和为n*n,其实就是n为中数,以及平均数,因为是偶数个,所以思考一下,n是不应该出现在数组中的,所以就是n-(n/2)~n-1,以及n+1~(n+n/2).举个例子:当n为6的时候 ,数组应该是3 4 5 7 8 9,这样,一定是满足的。
第二种:奇数的话,肯定是和偶数不一样的,奇数我们可以这样,因为连续的自然数长度为n的数组,最大值-最小值=n-1,所以我们可以选择n+2作为中数,连续的n+2个连续的数,所以这个数组的和为(n+2)*(n+2),这个长度为n+2的数组最大值-最小值=(n+1),因为我们构造出来长度数组需要为n,可以使该数组的和为(n+1)*(n+1),所以最后的数组就是这个长度为(n+2)的数组里面减去2个和为(n+2)*(n+2)-(n+1)*(n+1). 根据数论[(n+2)*(n+2)-(n+1)*(n+1)]/2 一定是在改数组面,所以就是当i!=[(n+2)*(n+2)-(n+1)*(n+1)]/2和i!=[(n+2)*(n+2)-(n+1)*(n+1)]/2+1的时候输出就行了,其他的n个数输出就行。
AC代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int a[N];
void solve(){
int n;
cin>>n;
if(n%2==1){
n+=2;
int op=n*n-(n-1)*(n-1);
op/=2;
for(int i=n-n/2;i<=n+n/2;i++){
if(i!=op&&i!=op+1){
cout<<i<<" ";
}
}
cout<<"\n";
}
else {
for(int i=n-n/2;i<=n-1;i++){
cout<<i<<' ';
}
for(int i=n+1;i<=n+n/2;i++){
cout<<i<<" ";
}
cout<<"\n";
return ;
}
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
while(t--){
solve();
}
}