题目的意思开始看了好久~~~其实看懂了还好写....先将bisquares数打个表出来...这里为了方便搜索..我是打了两个表...一个是打出1~200000中每个数是不是bisquares,是的话组成这个数的最大p会是多少...另一个表是依次存着在其最大p值不大于M的bisquares.....

    搜索的时候先遍历打出的bisquares表枚举队首...

    然后再遍历bisquares表枚举第二个数

    这时就得出差了...然后就一步步走到a+(n-1)b...每走一步就用大户的1~200000那个表来判断下是否满足条件...

    输出的时候先给sort一下~~就行了...

Program:

/*  
ID: zzyzzy12
LANG: C++
TASK: ariprog
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
using namespace std;
struct node
{
int a,b;
}ans[10001];
int f[150000];
int i,j,N,M,k,y,p,s[150001],num;
bool cmp(node a,node b)
{
if (a.b==b.b) return a.a<b.a;
return a.b<b.b;
}
int main()
{
freopen("ariprog.in","r",stdin);
freopen("ariprog.out","w",stdout);
scanf("%d%d",&N,&M);
memset(f,-1,sizeof(f));
for (i=0;i<=M;i++)
for (j=i;j<=M;j++)
f[i*i+j*j]=j;
k=0;
for (i=0;i<=150000;i++)
if (f[i]>=0)
{
k++;
s[k]=i;
}
num=0;
for (i=1;i<=k;i++)
{
for (j=i+1;j<=k;j++)
{
y=s[j]-s[i];
for (p=2;p<N;p++)
if (s[i]+y*p>2*M*M || f[s[i]+y*p]<0 || f[s[i]+y*p]>M) goto A;
num++;
ans[num].a=s[i]; ans[num].b=y;
A: ;
}
}
if (num)
{
sort(ans+1,ans+1+num,cmp);
for (i=1;i<=num;i++) printf("%d %d\n",ans[i].a,ans[i].b);
}else printf("NONE\n");
return 0;
}