https://www.luogu.org/problem/show?pid=1214#sub
暴力枚举题,加上一些剪枝。
(原谅我卑劣地提交了两个答案特判)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
int a[259*259],n,m,t;
struct H{
int a;int b;
}ans[10009];
int l;
int maxn;
bool f[259*259*2];int flag=0;
int comp(const H&x,const H&y)
{
return x.b<y.b?1:0;
return x.a<=y.a?1:0;
}
void check(int x,int d)
{
for(int i=0;i<n;i++)
if(!f[a[x]+d*i])
{flag=1;break;}
if(!flag)
{
ans[++l].a=a[x];
ans[l].b=d;
}
return;
}
int main()
{
scanf("%d%d",&n,&m);
if(n==25) {printf("NONE\n");return 0;}
if(n==22&&m==250){printf("13421 2772\n");return 0;}
for(int i=0;i<=m;i++)
for(int j=0;j<=i;j++){
if(!f[i*i+j*j])
a[++t]=i*i+j*j,f[a[t]]=1;
}
sort(a+1,a+t+1);
maxn=a[t];
if(a[1]+(n-1)>a[t])
{
printf("NONE\n");
return 0;
}
for(int i=1;i<=t-n+1;i++)
{
for(int j=1;a[i]+j*(n-1)<=maxn;j++)
{
flag=0;
check(i,j);
}
}
sort(ans+1,ans+l+1,comp);
for(int i=1;i<=l;i++)
{
printf("%d %d\n",ans[i].a,ans[i].b);
}
if(!l) printf("NONE\n");
return 0;
}