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