这道题主要就是搜索,搜索下一个是否满足条件即可,但是要注意时间的限制,一开始是用递归写的结果时间超时了,然后开始优化程序,用一个数组来保存所有的双平方数,然后在数组中寻找,这样就将递归用一层循环表示了。代码如下。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int arin=0,arim=0;
int bisquare[125005];
int arisearch(int a,int b,int cnt){
for (int i=0;i<arin;i++){
int x = a+i*b;
if (bisquare[x]){
cnt++;
}
}
if (cnt==arin){
return 1;
}
else {
return 0;
}
}
int main (){
freopen ("ariprog.in","r",stdin);
freopen ("ariprog.out","w",stdout);
cin>>arin>>arim;
bool k=false;
int a=0,b=0,amax=0;
for (int i=0;i<=arim;i++){
for (int j=0;j<=arim;j++){
bisquare[i*i+j*j]=1;
amax++;
}
}
int bmax=(2*arim*arim)/(arin-1);
for (b=1;b<=bmax;b++){
for (a=0;a<=amax;a++){
if(a+(arin-1)*b>2*arim*arim){
break;
}
if (bisquare[a]){
if (arisearch(a,b,0)){
k=true;
cout<<a<<" "<<b<<endl;
}
}
}
}
if (!k){
cout<<"NONE"<<endl;
}
return 0;
}