usaco Arithmetic Progressions 暴力破解

来源:互联网 发布:c语言if语句嵌套 编辑:程序博客网 时间:2024/05/17 05:07
//枚举,hash判断,注意输出无解信息 /*{ID: lzwjava1PROG: ariprogLANG: C++}*/#include<cstdio>#include<cstring>#include<math.h>#include<stdlib.h>#include<algorithm>using namespace std;const int maxn=125000+10;bool S[maxn];int n;bool is_ok(int a,int b){for(int i=0;i<=n-1;i++)if(!S[a+i*b]) return false;return true;}int main(){  freopen("ariprog.in","r",stdin);  freopen("ariprog.out","w",stdout);int i,j;int m;scanf("%d%d",&n,&m);int a,b,p,q;memset(S,false,sizeof(S));for(p=0;p<=m;p++)  for(q=p;q<=m;q++)  S[p*p+q*q]=true;  int maxS=m*m*2;  bool isNone=true;  for(b=1;(n-1)*b<=maxS;b++)    for(a=0;a+(n-1)*b<=maxS;a++)    {    if(is_ok(a,b))    {    printf("%d %d\n",a,b);    isNone=false;    }    }  if(isNone) printf("NONE\n");  return 0;}/**/

一开始我的思路是:先得到b,再得到a。也即得到一个数列,对于数列的第i个数x,看是否能将其写成x=p^2+q^2。可以规定p<=q。故让p从0枚举到根号(x/2),得到q=根号(x-p^2),判断一下它是否为整数。截尾后,跟原数相比,看是否小于1e-5。
后来认为压根就不用这样,而应该:根据m,生成双平方和的集合S,记其中最大的和为maxS。则(n-1)*b<=maxS。之和从0开始枚举a,直到a+(n-1)b>maxS为止。判断。判断某数是否在集合里。hash。

原创粉丝点击