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
山东省第二届ACM大学生程序设计竞赛
给你加密的方式
我们可以打表处理所有的结果然后输出就行
一开始以为只有对字母加密然后无限wa
ACcode:
#include <iostream> #include <cstdio> #include <cstring> #include <string> #define maxn 10000005 #define mod 997 #define ll long long using namespace std; char s[maxn]; char has[1000]; char ans[1234567]; bool flag; int pow_mod(int x,int n){ int res=1; x=x%mod; while(n>0){ if(n%2) res=res*x%mod; x=x*x%mod; n/=2; } return res; } bool init(int n){ memset(has,'\0',sizeof(has)); char aaa; for(int i=32;i<=126;++i){ aaa=i; int id=pow_mod(i,n); if(has[id]!='\0')return false; has[id]=aaa; } return true; } int main(){ int loop,n; scanf("%d",&loop); while(loop--){ scanf("%d",&n); scanf("%s",s); flag=true; flag=init(n); if(!n)flag=false; int tot=0; if(flag){ int len=strlen(s); int tmp; for(int i=0;i<len;i+=3){ tmp=(s[i]-'0') * 100+(s[i+1]-'0') * 10+s[i+2] - '0'; if(has[tmp]!='\0')ans[tot++]=has[tmp]; else { flag=false; break; } } ans[tot]=0; } printf("%s\n",flag?ans:"No Solution"); } return 0; } /* 4 2 590357035697030 0 001001001001001 1000000000 001001001001001 2 590357035697030 */