题目描述 一个等差数列是一个能表示成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
给出一个n代表这个等差数列有多少项,然后给出一个m,求出这个在问是否存在一个等差数列满足a+nb=q2+p2且q和p均小于等于m,(n=0,1,2,3…)
用数组s先存q2+p2的和并排序,然后去暴力看是否存在这样的等差数列,等差数列的首项一定是数组s中的数,公差最大为d=(2*m2-s[i])/(n-1)。
#include<iostream> #include<cstring> #include<algorithm> using namespace std; struct none{ int a,b; }q[10010]; int cmp(none a,none b){ if(a.b==b.b) return a.a<b.a; else return a.b<b.b; } int book[125000]; int cz(int a,int b,int n){ for(int i=0;i<n;i++){ if(book[a+i*b]!=1){ return 1; } } return 0; } int main(void){ int n,m; int s[22500]; cin>>n>>m; int k=0; memset(book,0,sizeof(book)); for(int i=0;i<=m;i++) for(int j=0;j<=m;j++){ if(book[i*i+j*j]==0){ s[k++]=i*i+j*j; book[i*i+j*j]=1; } } sort(s,s+k); int m1=2*m*m; int l=0; //memset(book,0,sizeof(book)); for(int i=0;i<k;i++){ int d=(m1-s[i])/(n-1);//最大的公差 for(int j=1;j<=d;j++){ if(cz(s[i],j,n)==0){ q[l].a=s[i]; q[l++].b=j; } } } sort(q,q+l,cmp); if(l==0) cout<<"NONE"<<endl; else{ for(int i=0;i<l;i++) cout<<q[i].a<<" "<<q[i].b<<endl; } return 0; }