POJ 2635 The Embarrassed Cryptographer

    技术2022-05-20  72

    这题的k很大,高达10^100,只能用高精度表示,另外,由于l(1~1000000)也比较大,根据前人经验,在十进制下作会TLE,所以要转化成1000进制,这样可以节省大约2/3的时间

     

    然后,从小到大枚举素数,模拟除法的过程取余

    写代码的时候已经在while循环里读了k和l,我居然又在循环内部读了一遍,测试的时候我还一直以为是哪里写错进死循环了,囧

     

    代码:

    #include<iostream> #include<memory.h> #include<cstdio> #include<cmath> #include<string.h> using namespace std; int flag[1000005],factor[10000005]; int k,l,p,cnt; char s[105]; int t[105]; void make_factor() { int i,j; flag[1]=1; for(i=2,cnt=0;i<=1000000;i++) { if(!flag[i]) { factor[cnt++]=i; for(j=i*2;j<=1000000;j+=i) { flag[j]=1; } } } } int divide(int len) { int i,j,x; for(j=0;j<cnt;j++) { x=0; //cout<<"f "<<factor[j]<<endl; if(factor[j]>l) return factor[j]; for(i=len-1;i>=0;i--) { x=x*1000+t[i]; //cout<<"x "<<x<<endl; x%=factor[j]; //cout<<"res "<<x<<endl; } if(x==0) return factor[j]; } return 1000005; } void solve() { int i,j,len,ll=strlen(s),a; len=a=j=0; for(i=ll-1;i>=0;i--) { a++; if(a==1) j+=s[i]-'0'; else if(a==2) j+=(s[i]-'0')*10; else j+=(s[i]-'0')*100; if(a==3) { t[len++]=j; j=a=0; } } if(a) t[len++]=j; /*cout<<len<<endl; for(i=0;i<len;i++) cout<<t[i]<<endl;*/ if((p=divide(len))<l) printf("BAD %d/n",p); else printf("GOOD/n"); } int main() { make_factor(); while(scanf("%s %d",&s,&l)!=EOF) { if(s[0]=='0'&&l==0) break; solve(); } return 0; } 


    最新回复(0)