版权声明:转载无所谓的。。。 https://blog.csdn.net/xuxiayang/article/details/83110784
大意
求出所有能被 表出的长度为 的等差数列
思路
模拟+优化
首先预处理
一重循环枚举等差数列的差,另一重循环枚举开始的数,然后通过打表可以发现,当 足够大时,等差数列的差只能为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");//没有任何满足条件的
}