题意:
给一个整数N,要求找到一个序列0-(n-1),使得序列中每一个数ai,均满足ai+i为一个平方数,最后输出序列,若该序列不存在,则输出-1.
思路:
构造题,不难发现:若ak+k为一个平方数,则(ak-1)+(k+1)以及(ak+1)+(k-1)均为平方数,所以,只需要从后往前(因为越往后k越大),找到最近的一个平方数(防止i越界,最优),然后像左不断重复直到全部铺满或者发现重复。
代码:
set<int> num;
int a[200005];
void work(){
int n;
cin>>n;
for (int i=n-1;i>=0;i--){
int m=*num.lower_bound(i);
int mm=m-i;
a[i]=m-i;
while(mm!=i && i>=0){
i--;
a[i]=m-i;
}
}
for (int i=0;i<=n-1;i++) cout<<a[i]<<' ';
cout<<"\n";
return;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
ll t;
cin>>t;
while (t--){
for (int i=0;i<=500;i++) num.insert(i*i);
work();
}
return 0;
}