定义双平方数为可以表示为两个自然数的平方和的数。要求找出双平方数集合中的所有等差数列。给定 (n) 为数列长度,(m) 为 (p^2+q^2) 中 (p,q) 的上界
Solution
首先筛出所有双平方数,然后枚举数列的第一项和第二项,暴力判断即可
复杂度为 (O(nalpha(m^2)^2))
#include <bits/stdc++.h>
using namespace std;
int n,m,isp[1000005];
struct pii {
int x,y;
bool operator < (const pii &b) const {
if(y==b.y) return x<b.x;
return y<b.y;
}
};
vector <pii> v;
signed main() {
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=0;i<=m;i++) {
for(int j=0;j<=m;j++) {
isp[i*i+j*j]=1;
}
}
for(int i=0;i<=2*m*m;i++) {
if(isp[i]==0) continue;
for(int j=i+1;j<=min(2*m*m,4*m*m/n+i);j++) {
if(isp[j]==0) continue;
int d=j-i;
int mx=i+(n-1)*d;
if(mx>2*m*m) break;
int flag=1;
for(int k=3;k<=n;k++) {
int x=i+k*d-d;
if(isp[x]==0) {
flag=0;
break;
}
}
if(flag) v.push_back({i,d});
}
}
sort(v.begin(),v.end());
for(pii p:v) cout<<p.x<<" "<<p.y<<endl;
if(v.begin()==v.end()) cout<<"NONE"<<endl;
}