专栏文章
题解:CF2071B Perfecto
CF2071B题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @miq3i6y3
- 此快照首次捕获于
- 2025/12/03 22:21 3 个月前
- 此快照最后确认于
- 2025/12/03 22:21 3 个月前
简述题意
判断是否存在一个排列:
- 长度为 ;
- 。
存在则输出。
算法分析
很容易判断无解:如果 为完全平方数,那么无解。
接下来判断如何输出一个解。
首先 告诉我们这题是 的。
所以先构造 。
很显然,当前不为一个正解。
我们发现,前 个数包含 的所有数。
那么前 个数的和为 。如果这个数不为完全平方数,跳过;否则,交换 和 。
因为令 ,第 个数为 。那么新方案前 个数和为 ,如果 ,则有 (不然和会超过),即 。
显然 是 级别的,不存在 ,那么 不为完全平方数。
这样我们就找到了一个方案使得有解。
代码实现
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[114514*10],sum[114514*10];
signed main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
if((n+1)*n/2==(int)sqrt((n+1)*n/2)*(int)sqrt((n+1)*n/2)) cout<<"-1\n";
else
{
for(int i=1;i<=n;i++) a[i]=i;
for(int i=1;i<=n;i++)
{
sum[i]=sum[i-1]+a[i];
if(sum[i]==(int)sqrt(sum[i])*(int)sqrt(sum[i])) swap(a[i],a[i+1]);
sum[i]=sum[i-1]+a[i];
}
for(int i=1;i<=n;i++) cout<<a[i]<<' ';
cout<<'\n';
}
}
return 0;
}
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...