这道题相对来说比较简单
唯一的一点就是从正向公式逆推出负向公式,需要一些模运算的知识
#include<bits/stdc++.h>
using namespace std;
int plaincode[80],ciphercode[80];
int main() {
ios::sync_with_stdio(false);
//用了两个map来存储从数字到字母,从字母到数字的转换
map<int,char> code1;
map<char,int> code2;
code1[0]='_';
code1[27]='.';
for(int i=1; i<=26; i++) {
code1[i]='a'+i-1;
}
for(auto c:code1) {
code2.insert(make_pair(c.second,c.first));
}
int k;
while(cin>>k&&k) {
memset(plaincode,0,sizeof(plaincode));
memset(ciphercode,0,sizeof(ciphercode));
string plaintext,ciphertext;
cin>>ciphertext;
int n=ciphertext.size();
plaintext.resize(n);
for(int i=0; i<n; i++) {
ciphercode[i]=code2[ciphertext[i]];
plaincode[k*i%n]=(ciphercode[i]+i)%28;
plaintext[k*i%n]=code1[plaincode[k*i%n]];
}
cout<<plaintext<<endl;
}
return 0;
}