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]!='