您的位置:首页 > 其它

[ZOJ 1006] Do the Untwist (模拟实现解密)

2014-11-12 21:36 381 查看
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6

题目大意:给你加密方式,请你求出解密。

直接逆运算搞,用到同余定理

#include <cstdio>
#include <cstdlib>
#include <string>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <vector>
#include <map>
#include <set>
#include <iterator>
#include <functional>
#include <cmath>
#include <numeric>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define PB push_back
#define MP make_pair
#define SZ size()
#define CL clear()
#define AA first
#define BB second
#define EPS 1e-8
#define ZERO(x) memset((x),0,sizeof(x))
const int INF = ~0U>>1;
const double PI = acos(-1.0);

int get_num(char c){
if( c=='_' ) return 0;
if( c=='.') return 27;
return c-'a'+1;
}

char get_char(int n){
if( n==0 ) return '_';
if( n==27 ) return '.';
return n+'a'-1;
}

int main(){
int k;
while( scanf("%d",&k),k ){
char buff[100];
scanf("%s",buff);
int plaincode[100],ciphercode[100];
ZERO(plaincode); ZERO(ciphercode);
int n = strlen(buff);
for(int i=0;i<n;i++){
ciphercode[i] = get_num(buff[i]);
}
for(int i=0;i<n;i++){
plaincode[(k*i)%n] = (ciphercode[i] + i)%28;
}
for(int i=0;i<n;i++){
putchar(get_char(plaincode[i]));
}
puts("");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: