sdut 2165:Crack Mathmen(第二届山东省省赛原题,数论)
Crack Mathmen
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
For example, if they choose n = 2 and the message is "World" (without quotation marks), they encode the message like this:
1. the first character is 'W', and it's ASCII code is 87. Then f(′W′) = 87^2 mod 997 = 590.
2. the second character is 'o', and it's ASCII code is 111. Then f(′o′) = 111^2 mod 997 = 357.
3. the third character is 'r', and it's ASCII code is 114. Then f(′r′) = 114^2 mod 997 = 35. Since 10 <= f(′r′) < 100, they add a 0 in front and make it 035.
4. the forth character is 'l', and it's ASCII code is 108. Then f(′l′) = 108^2 mod 997 = 697.
5. the fifth character is 'd', and it's ASCII code is 100. Then f(′d′) = 100^2 mod 997 = 30. Since 10 <= f(′d′) < 100, they add a 0 in front and make it 030.
6. Hence, the encrypted message is "590357035697030".
One day, an encrypted message a mathman sent was intercepted by the human being. As the cleverest one, could you find out what the plain text (i.e., the message before encryption) was?
输入
输出
示例输入
3 2 590357035697030 0 001001001001001 1000000000 001001001001001
示例输出
World No Solution No Solution
提示
来源
1 #include <stdio.h>
2 #include <iostream>
3 #include <string.h>
4 using namespace std;
5 char a[1000001];
6 char b[400001];
7 char map[1000]; //映射
8 int GetM(int t,int n) //快速幂求模
9 {
10 int ans = 1;
11 while(n){
12 if(n & 1)
13 ans = (ans*t)%997;
14 t=t*t%997;
15 n>>=1;
16 }
17 return ans;
18 }
19 bool GetMap(int n) //产生映射表
20 {
21 int c;
22 for(c=32;c<=126;c++){
23 int t = GetM(c,n);
24 if(map[t]!='\0') //该值已有对应的字母
25 return false;
26 map[t] = char(c);
27 }
28 return true;
29 }
30 int main()
31 {
32 int T;
33 scanf("%d",&T);
34 while(T--){
35 int i,n,len = 0;
36 scanf("%d",&n);
37 scanf("%s",a);
38 memset(map,'\0',sizeof(map)); //初始化映射
39 if(!GetMap(n)){ //产生映射.如果失败,输出提示,退出本次循环
40 printf("No Solution\n");
41 continue;
42 }
43 //没有冲突,产生映射成功,根据映射表解码
44 int t = 0;
45 int Len = strlen(a);
46 for(i=0;i<Len;i+=3){
47 t = (a[i]-'0')*100 + (a[i+1]-'0')*10 + (a[i+2]-'0');
48 if(map[t]=='\0') //没有对应的映射
49 break;
50 b[len++] = map[t];
51 }
52 if(i<Len) //提前跳出
53 printf("No Solution\n");
54 else{
55 b[len] = '\0';
56 cout<<b<<endl;
57 }
58 }
59 return 0;
60 }
Freecode : www.cnblogs.com/yym2013