问。
  • 板块学术版
  • 楼主poor_OIer
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/9 22:21
  • 上次更新2024/8/9 22:46:02
查看原帖
问。
704634
poor_OIer楼主2024/8/9 22:21

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?

2024/8/9 22:21
加载中...