usaco也开始限时了,这题是搜索加剪枝。剪枝很关键。(哎。。。。。。。。怎么才能不看题解解题啊)
/*
ID: jinbo wu
LANG: C++
TASK: ariprog
*/
#include<bits/stdc++.h>
using namespace std;
bool v[125010];
int a[100000];
int n;
bool check(int b,int i)
{
int k=a[i];
for(int i=1;i<n;i++)
{
if(!v[k+=b])
return 0;
}
return 1;
}
int main()
{
freopen("ariprog.in","r",stdin);
freopen("ariprog.out","w",stdout);
int m;
scanf("%d %d",&n,&m);
int l=0;
for(int i=0;i<=m;i++)
for(int j=0;j<=m;j++)
{
if(!v[i*i+j*j])
{
a[l++]=i*i+j*j;
v[a[l-1]]=1;
}
}
sort(a,a+l);
int d=(a[l-1]-a[0])/(n-1);//剪枝
int flag=0;
for(int b=1;b<=d;b++)
{
for(int i=0;i<l;i++)
{
if(a[i]+(n-1)*b>a[l-1])
break;//剪枝
if(check(b,i))
{
printf("%d %d\n",a[i],b);
flag=1;
}
}
}
if(!flag)
puts("NONE");
}