题目大意:
给出两个整数n、m。要求找出一个n位等差数列,其元素属于集合{ p*p+q*q | 0<=p,q<=m }。
思路:
简单暴搜,具体思路见代码。
代码:
/* ID: lujunda1 LANG: C++ PROG: ariprog */ #include<iostream> #include<stdio.h> using namespace std; bool s[125001];//250*250*2 int n,m; bool check(int start,int dif) //判断是否存在从start开始,差为dif的n位等差数列。 { for(int i=0;i<n;i++) if(!s[start+dif*i]) return false; return true; } void solve() { int total=0; for(int i=1;i<=2*m*m/(n-1);i++) //i表示等差数列的差值,范围是[1,2*m*m/(n-1)]。 for(int j=0;j<=2*m*m-i*(n-1);j++) //j表示等差数列的起始位置,范围是[0,2*m*m-i*(n-1)]。 if(check(j,i)) { total++; printf("%d %d\n",j,i); } if(!total) //不存在符合要求的等差数列时,输出“NONO”。 printf("NONE\n"); } int main() { freopen("ariprog.in","r",stdin); freopen("ariprog.out","w",stdout); for(int i=0;i<125001;i++) s[i]=false; scanf("%d%d",&n,&m); for(int i=0;i<=m;i++) for(int j=i;j<=m;j++) //枚举出所有p*p+q*q。 s[i*i+j*j]=true; solve(); }