Codeforces Round #844 D

D. Many Perfect Squares

题链
一个小时没出D 好似喵
我们看到这个n只有50
然后思考了 两个平方数之差有什么关系
发现都是 (aj+x)^2 - (ai+x)^2
我们设A=aj+x B=ai+x
A2-B2=(A+B)(A-B)=aj-ai
这样我们就可以暴力n2枚举每一个i j
然后再枚举这个aj-ai的两个因子(A+B)(A-B)这样就可以求的x为多少
之后再O(n)计算一遍在此x下能有多少平方数
注意我们的x的取值范围是[0,1e18] 会爆ll的同时 还不能取负数

int n,a[55];
void solve(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    int ans=1;
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            int d=a[j]-a[i];
            for(int x=1;x<=d/x;x++){
                if(d%x==0){
                    int y=d/x;
                    if((x+y)%2||(y-x)%2)continue;
                    int A=(x+y)/2;
                    if(A*A>=a[j]){
                        int res=0,X=A*A-a[j];
                        for(int k=1;k<=n;k++){
                            db s=sqrt((db)a[k]+(db)X);
                            if(abs(s-ceil(s))<1e-12||abs(s-floor(s))<1e-12){
                                res++;
                                //cout<<s<<' '<<ceil(s)<<' '<<floor(s)<<endl;
                            }
                        }
                        ans=max(ans,res);
                    }
                }
            }
        }
    }
    cout<<ans<<endl;
}
posted @ 2023-01-16 13:41  ycllz  阅读(22)  评论(0)    收藏  举报