社区讨论

Why CF1059 Div.3 G n^3 剪枝可过

学术版参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mhj1iljw
此快照首次捕获于
2025/11/03 19:11
4 个月前
此快照最后确认于
2025/11/03 19:11
4 个月前
查看原帖
如题,经打表验证,n[1,2×105]n\in[1,2\times 10^5] 该做法均可高效计算,并且在赛时通过。
求证时间复杂度正确性。
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 条回复,欢迎继续交流。

正在加载回复...