有两种方法:
1.先枚举公差再枚举首项,这样做的优点是不用排序
2.先枚举首项再枚举公差.
第一遍交的时候就是用的第一种方法,超时.后来改为第二种方法,qsort()排序,AC.
我的源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | /* ID: tgh7281 LANG: C++ TASK: ariprog */ #include <iostream> #include <fstream> using namespace std; bool status[250*250*2+1]; struct progression { int a; //首项 int b; //公差 }ariprog[10000]; bool check(int a,int b,int n); int cmp(const void*a,const void*b); int main() { int i,j; ifstream fin("ariprog.in"); ofstream fout("ariprog.out"); memset(status,false,sizeof(status)); int n,m; fin>>n>>m; for (i=0;i<=m;i++) //initial { for (j=i;j<=m;j++) { status[i*i+j*j]=true; } } int a,b,count=0,M=2*m*m; for (a=0;a<=M;a++) //枚举首项 { if (!status[a]) continue; for (b=1;a+(n-1)*b<=M;b++) //枚举公差 { if (check(a,b,n)) { ariprog[count].a=a; ariprog[count].b=b; count++; } } } if (count) { qsort(ariprog,count,sizeof(ariprog[0]),cmp); for (i=0;i<count;i++) fout<<ariprog[i].a<<’ ‘<<ariprog[i].b<<endl; } else fout<<"NONE"<<endl; fin.close(); fout.close(); return 0; } bool check(int a,int b,int n) { for (int i=1;i<n;i++) if (!status[a+i*b]) return false; return true; } int cmp(const void*a,const void*b) { progression*c=(progression*)a; progression*d=(progression*)b; if (c->b==d->b) return c->a-d->a; return c->b-d->b; } |











