https://www.luogu.org/problemnew/show/P1214
#include<bits/stdc++.h>
using namespace std;
#define Max (int)(1e5+10)
typedef long long ll;
struct item {
int a,b;
bool operator <(item x) {
return b==x.b?a<x.a:b<x.b;
}
} k[Max];
bool vis[125100],flag;
int a[62600],n,m,t,num;
int main() {
t=0,num=0;
scanf("%d%d",&n,&m);
for(int i=0; i<=m; i++)
for(int j=0; j<=m; j++)
if(vis[i*i+j*j]==0) {
a[++t]=i*i+j*j;
vis[i*i+j*j]=1;
}
sort(a+1,a+1+t);//排序使得b>0
for(int i=1; i<=t-n+1; i++)
for(int j=i+1; j<=t-n+2; j++) {
flag=1;
int d=a[j]-a[i];
if((a[i]+(n-1)*d)>2*m*m)//优化,加了这个条件就AC了
break;
for(int x=2; x<n; x++)
if(!vis[a[i]+x*d]) {
flag=0;
break;
}
if(flag) {
num++;
k[num].a=a[i];
k[num].b=d;
}
}
sort(k+1,k+1+num);
if(num==0)
printf("NONE\n");
else
for(int i=1; i<=num; i++)
printf("%d %d\n",k[i].a,k[i].b);
}