加密方式ciphercode[i] = (plaincode[k*i mod n] - i) mod 28.
n为字符串长度 k为key
题目为给出key和密文
求原来的文字= =
然后=_=因为只是平移就
plain[k*i mod n]= cipher[i]+i
如果右边笔28大就mod一下就好
密文和原文是一一对应的 (you can assume that untwisting a message always yields a unique result.)
"For those of you with some knowledge of basic number theory or abstract algebra, this will be the case provided that the greatest common divisor of the key k and length n is 1, which it will be for all test cases."
#include <bits/stdc++.h>
using namespace std;
int k;
int a[200],b[200];
int Get(char cc)
{
if (cc=='_') return 0;
if (cc=='.') return 27;
return cc-'a'+1;
}
char Ans(int i)
{
if (i==0)
return '_';
if (i==27)
return '.';
return ('a'+i-1);
}
void Gao()
{
char s[200],s1[200];
scanf("%s",s);
int n=strlen(s);
for (int i=0;i<n;i++)
a[i]=Get(s[i]);
for (int i=0;i<n;i++)
{
b[(k*i)%n]=a[i]+i;
if (b[k*i%n]>27)
b[k*i%n]%=28;
}
for (int i=0;i<n;i++)
cout<<Ans(b[i]);
cout<<endl;
}
int main()
{
freopen("a.in","r",stdin);
while (cin>>k)
{
if (k==0)
break;
Gao();
}
return 0;
}