1231. The Embarrassed Cryptography
2011-04-23 10:11
246 查看
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
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
相关文章推荐
- Sicily1231. The Embarrassed Cryptography
- 1231. The Embarrassed Cryptography
- sicily 1231 The Embarrassed Cryptography
- 1231. The Embarrassed Cryptography(求两个素数积)
- sicily 1231. The Embarrassed Cryptography
- 1231 The Embarrassed Cryptography
- Sicily 1231. The Embarrassed Cryptography【高精度取余】
- sicily 1231. The Embarrassed Cryptography
- sicily 1231. The Embarrassed Cryptography
- 密码学历史(The History of Cryptography)(6)
- The Cryptography API, or How to Keep a Secret(四)
- POJ 1231 The Alphabet Game 笔记
- poj 2635 The Embarrassed Cryptographer(素数筛 + 同余模定理)
- POJ235 The Embarrassed Cryptographer
- POJ 2635 The Embarrassed Cryptographer 大数取模
- POJ 2635 The Embarrassed Cryptographer
- POJ 2635 The Embarrassed Cryptographer
- poj The Embarrassed Cryptographer(大数取模)(同余模定理)
- System.Security.Cryptography.CryptographicException: The system cannot find the file specified
- 密码学——OSI安全框架(Cryptography - The OSI Security Architecture)