社区讨论
Why CF1059 Div.3 G n^3 剪枝可过
学术版参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhj1iljw
- 此快照首次捕获于
- 2025/11/03 19:11 4 个月前
- 此快照最后确认于
- 2025/11/03 19:11 4 个月前
如题,经打表验证, 该做法均可高效计算,并且在赛时通过。
求证时间复杂度正确性。
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
bool wsq(int s)
{
int r=sqrt(s);
return (r*r==s);
}
signed main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
if(n==2)
{
cout<<-1<<endl;
continue;
}
int T=n*(n+1)/2;
bool flag=0;
for(int c=1;c<=n;c++)
{
int s0=c*(T-c);
if(wsq(s0))
{
for(int i=1;i<=n;i++) if(i!=c) cout<<c<<" "<<i<<endl;
flag=1;
break;
}
}
if(flag) continue;
for(int c=1;c<=n;c++)
{
int s0=c*(T-c);
for(int i=1;i<=n;i++)
{
if(i==c) continue;
for(int j=1;j<=n;j++)
{
if(j==c||j==i) continue;
int ns=s0+i*(j-c);
if(wsq(ns))
{
for(int k=1;k<=n;k++) if(k!=c&&k!=i) cout<<c<<" "<<k<<endl;
cout<<j<<" "<<i<<endl;
flag=1;
break;
}
}
if(flag) break;
}
if(flag) break;
}
if(!flag) cout<<-1<<endl;
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...