1. 程式人生 > >usaco1.4.3等差數列

usaco1.4.3等差數列

return printf print 上界 整數 枚舉 表示 一行 bsp

為這道茍題鼓掌

題目:

一個等差數列是一個能表示成a, a+b, a+2b,…, a+nb (n=0,1,2,3,…)的數列。在這個問題中a是一個非負的整數,b是正整數。寫一個程序來找出在雙平方數集合(雙平方數集合是所有能表示成p的平方 + q的平方的數的集合,其中p和q為非負整數)S中長度為n的等差數列。

輸入格式:

第一行: N(3<= N<=25),要找的等差數列的長度。
第二行: M(1<= M<=250),搜索雙平方數的上界0 <= p,q <= M。

輸出格式:

如果沒有找到數列,輸出`NONE’。
如果找到了,輸出一行或多行, 每行由二個整數組成:a,b。
這些行應該先按b排序再按a排序。
所求的等差數列將不會多於10,000個。

樣例:
輸入

5
7

輸出

1 4
37 4
2 8
29 8
1 12
5 12
13 12
17 12
5 20
2 24

代碼:

#include <bits/stdc++.h>
using namespace std;
int ans[1000100],f[1000000];
int n,m,l=0,k,d1=0;
int main(){

scanf("%d%d",&n,&m);//輸入
for(int p=0;p<=m;p++)
for(int q=p;q<=m;q++)
ans[p*p+q*q]=1;//將可以表示為q*q+p*p的數標記為一
l=0;
for(int i=0;i<=m*m+m*m;i++)
{
l+=ans[i];
if(ans[i])
f[l]=i;//求出第l個
}
for(int j=1;j<=m*m*2/(n-1);j++)
{//枚舉長度
for(int i=1;i<=l;i++)
{//枚舉起點
if(f[i]+j*(n-1)>m*m*2)
break;//如果已大於最大值就退出
int c=1,d=f[i];
for(int k=1;k<=n-1;k++)
{
d=d+j;//枚舉每一項
if(!ans[d])
{//如果不是就退出
c=0;
break;
}
}
if(c){d1=1;printf("%d %d\n",f[i],j);}//判斷輸出
}
}
if(d1==0)printf("NONE\n");//如果沒有合法序列輸出NONE
return 0;
}

usaco1.4.3等差數列