题目大意:

给出两个整数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();
}