[USACO1.4]等差数列 Arithmetic Progressions

版权声明:转载无所谓的。。。 https://blog.csdn.net/xuxiayang/article/details/83110784

大意

求出所有能被 p 2 + q 2 p , q m p^2+q^2(p,q\leq m) 表出的长度为 n n 的等差数列


思路

模拟+优化

首先预处理

一重循环枚举等差数列的差,另一重循环枚举开始的数,然后通过打表可以发现,当 n n 足够大时,等差数列的差只能为4的倍数


代码

#include<cstdio>
#include<algorithm>
using namespace std;int n,m;
bool ok[1350001]={1,1},ojbk;
struct node{int a,b;}p[150001];
inline bool cmp(node x,node y){return x.b<y.b||x.b==y.b&&x.a<y.a;}
inline bool check(register int x,register int y)
{
    for(register int i=1;i<=n;i++) 
    {if(!ok[x]) return false;x+=y;}//判断是否满足
    return true;
}
signed main()
{
    scanf("%d%d",&n,&m);
    for(register int i=0;i<=m;i++) for(register int j=0;j<=m;j++) ok[i*i+j*j]=true;
    for(register int j=(n<4?1:4);j*n<=m+m*m<<1;j+=(n<4?1:4))for(register int i=0;i<=m*m;i++)
    if(check(i,j)) printf("%d %d\n",i,j),ojbk=true;
    if(!ojbk) puts("NONE");//没有任何满足条件的
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/83110784
今日推荐