代码改变世界

1231. The Embarrassed Cryptography

2011-04-23 10:11  Min·zc  阅读(197)  评论(0编辑  收藏  举报
  1 /*
  2  *
  3  *写的比较丑,就将就看吧,懒得重写了
  4  *先用筛法求出10^6内的素数
  5  *然后用所有小于div的素数去除那个密码,如果整除了就说明有问题输出BAD
  6  *为了加快高精度除法的速度,将密码按照三位分组,每次除三位
  7  *
  8  *
  9  */
 10 
 11 
 12 #include <iostream>
 13 #include <string.h>
 14 #include <memory.h>
 15 using namespace std;
 16 int prime[8000];
 17 char tem[1000010];
 18 char n[101];
 19 int num[40];
 20 int xl;
 21 int div;
 22 void setprime()
 23 {
 24     memset(tem,0,sizeof(tem));
 25     for(int i=2;i<1000000;i++)
 26     {
 27         if(tem[i]==0)
 28         {
 29             prime[xl++]=i;
 30             for(int j=2;j*i<1000000;j++)
 31                 tem[i*j]=1;
 32         }
 33     }
 34 }
 35 int change()
 36 {
 37     memset(num,0,sizeof(num));
 38     int t=strlen(n);
 39     int a=t/3;
 40     for(int i=0;i<a;i++)
 41     {
 42         int ans=0;
 43         for(int j=0;j<3;j++)
 44         {
 45             num[i]=(num[i]+n[i*3+j]-'0')*10;    
 46         }
 47         num[i]/=10;
 48     }
 49     int b=t-a*3;
 50     for(int i=0;i<b;i++)
 51         num[a]=(num[a]+n[a*3+i]-'0')*10;
 52     num[a]/=10;
 53 //  for(int i=0;i<=a;i++)
 54 //      cout<<num[i]<<" ";
 55 //  cout<<endl;
 56 }
 57 int check()
 58 {
 59     for(int i=0;prime[i]<div;i++)
 60     {
 61 
 62         int t=strlen(n);
 63         int a=t%3==0?t/3:t/3+1;
 64 //      cout<<"a="<<a<<endl;
 65         int ans=0;
 66         for(int j=0;j<a-1;j++)
 67         {
 68             ans=(ans*1000+num[j]);
 69             ans%=prime[i];
 70         }
 71 //      cout<<num[a-1]<<endl;
 72         if(t%3==0)     //因为最后一组不一定刚好是三位,所以需要根据情况讨论
 73         {
 74             ans=(ans*1000+num[a-1]);
 75             ans%=prime[i];
 76         }
 77         else if(t%3==1)
 78         {
 79             ans=(ans*10+num[a-1]);
 80             ans%=prime[i];
 81         }
 82         else if(t%3==2)
 83         {
 84             ans=(ans*100+num[a-1]);
 85             ans%=prime[i];
 86         }
 87         if(ans==0)
 88             return i;
 89     }
 90     return -1;
 91 }
 92 int main()
 93 {
 94     setprime();
 95     cin>>n>>div;
 96     while(div!=0&&(strcmp(n,"0")!=0))
 97     {
 98         change();
 99         int ans=check();
100         if(ans!=-1)
101             cout<<"BAD "<<prime[ans]<<endl;
102         else
103             cout<<"GOOD"<<endl;
104 
105         cin>>n>>div;
106         
107     }
108 }
109