/*
数论基础,以模余方程制造密码,求模 mod 的 k 次根,对密码解读...
RSA解密: 通过知道的 mod,和 k ,然后进行对密码破密....
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#define manx 50000
using namespace std;
long long kzgcd(long long a,long long b,long long &x,long long &y){/// 扩展欧几里得
if(!b){
x=1,y=0;
return a;
}
long long d = kzgcd(b,a%b,x,y);
long long t=y;
y=x-a/b*y;
x=t;
return d;
}
long long inv(long long a,long long b){ ///求逆元
long long x,y;
long long flag = kzgcd(a,b,x,y);
if(flag!=1) return -1;
return (x%b+b)%b;
}
long long mult(long long a,long long n,long long mod){ ///快速幂
if(n==1) return a;
long long b=1;
while(n>1){
if(n%2==0){
a=a*a%mod;
n /= 2;
}
else {
b=b*a%mod;
n--;
}
}
return a*b%mod;
}
long long x[manx],y[manx];
int main(){
long long p,q,k,n,m;
while(cin>>p>>q>>k>>n){
for(int i=1;i<=n;i++)
cin>>x[i];
m = p*q;
long long ans=(p-1)*(q-1);
long long val=inv(k,ans);
for(int i=1;i<=n;i++){
y[i]=mult(x[i],val,m);
}
for(int i=1;i<=n;i++) cout<<((char)y[i]);
cout<<endl;
}
}
/*
101 103 7 11
7716 7746 7497 126 8486 4708 7746 623 7298 7357 3239
I-LOVE-ACM.
*/
HDU 1211 RSA 解密
最新推荐文章于 2020-03-03 16:10:00 发布