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;
}
标签:844,int,aj,Codeforces,ai,Round
From: https://www.cnblogs.com/ycllz/p/17055220.html