54 等差数列
作者: xxx 时间限制: 1S 章节: 一维数组
问题描述 :
一个等差数列是一个能表示成a, a+b, a+2b,..., a+nb (n=0,1,2,3,...) 在这个问题中a是一个非负的整数,b是正整数。
写一个程序来找出在双平方数集合S中长度为n的等差数列。双平方数集合是所有能表示成p2+q2的数的集合。
输入说明 :
第一行: 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<stdio.h>
#include<string.h>
int N,M;
int set[125000];//双平方数集
int sup;//上界
int ans;//符合要求的a和b的对数
void initSet(){
//获取0<=p,q<=M的双平方数集
int pos;
for(int i=0;i<=M;i++){
for(int j=i;j<=M;j++){
pos=i*i+j*j;
set[pos]=1;//标记该下标为双平方数
}
}
sup=M*M+M*M;
}
bool isOk(int n){
//验证整数n是否为确定范围之内的双平方数
if(set[n]==1)return true;
return false;
}
void findOut(){
ans=0;
int a,b,i;
for(b=1;b*(N-1)<=sup;b++){
//b在外层,a在内层
//使得结果先按b排序再按a排序(均为升序)
for(a=0;a+b*(N-1)<=sup;a++){
for(i=0;i<N;i++){
if(!isOk(a+b*i))break;
}
if(i==N){
printf("%d %d\n",a,b);
ans++;
}
}
}
}
int main(){
memset(set,0,sizeof(set));//初始化set数组
scanf("%d%d",&N,&M);
initSet();
findOut();
if(ans==0)printf("NONE\n");
return 0;
}