1. 程式人生 > >[USACO1.4]等差數列 Arithmetic Progressions

[USACO1.4]等差數列 Arithmetic Progressions

大意

求出所有能被p2+q2p,qmp^2+q^2(p,q\leq m)表出的長度為nn的等差數列

思路

模擬+優化

首先預處理

一重迴圈列舉等差數列的差,另一重迴圈列舉開始的數,然後通過打表可以發現,當nn足夠大時,等差數列的差只能為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");//沒有任何滿足條件的 }