1.4.3 Arithmetic Progressions

好悲剧的一题啊,虽然时间给出了很多秒,可是超时啊,各种wa啊,主要是范围的问题,例如公差的范围,首项的范围,题解找了好久终于找到了范围,搞死我了,要写过一个更好的写法,这种枚举太费事了、、、

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<stdlib.h>
 5 #define INF     0x3f3f3f3f
 6 #define Maxin 10000
 7 int s[500000],q=0;
 8 
 9 int m;
10 int find(int x,int n)//公差 目标个数
11 {
12     int i;
13     int j=0,start;
14     for(i=0;i<=2*m*m-(n-1)*x;i++)//注意范围
15     {
16       int time=0;
17       while(s[i]==0&&i<=m*m*2-(n-1)*x)//找起点
18           i++;
19       start=i;//确立起点
20       while(s[start]==1)//保证下一个也是在数列内
21       {
22           time++; 
23           start+=x;
24           if(time==n)//满足条件  
25           {
26              q=1;
27              printf("%d %d\n",i,x);
28              break;
29           }
30       }
31     }
32     return 0;
33 }
34 int main()
35 {
36     int n,x,y;
37     scanf("%d%d",&n,&m);
38     memset(s,0,sizeof(s));
39     for(x=0;x<=m;x++)    
40         for(y=0;y<=m;y++)
41             s[x*x+y*y]=1;
42 
43         for(x=1;x<=m*m*2/(n-1);x++)//枚举公差,注意范围
44             find(x,n);
45 
46         if(q==0)
47             printf("NONE\n");
48     return 0;
49 }

posted on 2012-05-17 15:58  usp10  阅读(174)  评论(0编辑  收藏  举报

导航