[USACO1.4]等差數列 Arithmetic Progressions
阿新 • • 發佈:2018-12-15
大意
求出所有能被表出的長度為的等差數列
思路
模擬+優化
首先預處理
一重迴圈列舉等差數列的差,另一重迴圈列舉開始的數,然後通過打表可以發現,當足夠大時,等差數列的差只能為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");//沒有任何滿足條件的
}