P1214 [USACO1.4] 等差数列 Arithmetic Progressions
#include<iostream>
#include<algorithm>
using namespace std;
struct data{
int a,b;
};
data ans[10010];
int n,m,cnt;
bool book[250*250*2+10];//用来存是否为双平方数
bool cmp(data x,data y)
{
if(x.b<y.b)
return true;
if(x.b==y.b&&x.a<y.a)
return true;
return false;
}
int main(){
cin>>n>>m;
for(int i=0;i<=m;i++)
for(int j=0;j<=m;j++)
book[i*i+j*j]=true;
int maxm=m*m*2;//枚举的上限
for(int i=0;i<=maxm;i++)
{
if(book[i])
{
for(int j=i+1;j<=maxm;j++)
{
if(book[j])
{
int d=j-i;//公差
int maxi=i+d*(n-1);//最后一个数
if(maxi>maxm)
break;//如果最后一个数大于上限,则跳出
bool f=true;
for(int j=i+d;j<=maxi;j+=d)
{
if(!book[j])
{
f=false;
break;
}//如果等差数列有一个数不是质数,则不是合法答案
}
if(f)
{
cnt++;
ans[cnt].a=i;
ans[cnt].b=d;
}//储存合法答案
}
}
}
}
if(cnt==0)
{
cout<<"NONE";
return 0;
}//如果没有,输出"NONE"
sort(ans+1,ans+cnt+1,cmp);//对合法答案排序
for(int i=1;i<=cnt;i++)
cout<<ans[i].a<<' '<<ans[i].b<<endl;//输出
return 0;
}
这题解里用循环嵌套为什么用了两次j?