山东省第二届ACM大学生程序设计竞赛 Crack Mathmen 打表 模拟

Crack Mathmen

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

  Since mathmen take security very seriously, they communicate in encrypted  messages. They cipher their texts in this way: for every characther c in the  message, they replace c with f(c) = (the ASCII code of c)n mod 1997  if f(c) < 10, they put two preceding zeros in front of f(c) to make it a three  digit number; if 10 <= f(c) < 100, they put one preceding zero in front of  f(c) to make it a three digit number.

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?

输入

  The input contains multiple test cases. The first line of the input contains  a integer, indicating the number of test cases in the input. The first line of  each test case contains a non-negative integer n (n <= 10^9). The second line  of each test case contains a string of digits. The length of the string is at  most 10^6.

输出

  For each test case, output a line containing the plain text. If their are no or  more than one possible plain text that can be encrypted as the input, then  output "No Solution" (without quotation marks).  Since mathmen use only alphebetical letters and digits, you can assume  that no characters other than alphebetical letters and digits may occur in  the plain text.  Print a line between two test cases.

示例输入

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
*/



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值