Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2353 Accepted Submission(s): 1677
> choose two large prime integer p, q
> calculate n = p × q, calculate F(n) = (p - 1) × (q - 1)
> choose an integer e(1 < e < F(n)), making gcd(e, F(n)) = 1, e will be the public key
> calculate d, making d × e mod F(n) = 1 mod F(n), and d will be the private key
You can encrypt data with this method :
C = E(m) = me mod n
When you want to decrypt data, use this method :
M = D(c) = cd mod n
Here, c is an integer ASCII value of a letter of cryptograph and m is an integer ASCII value of a letter of plain text.
Now given p, q, e and some cryptograph, your task is to "translate" the cryptograph into plain text.
using namespace std;
#define LL long long
#define lld long long
void exGcd (lld a, lld b, lld &d, lld &x, lld &y)
{
if (b == 0)
{
x = 1 ;
y = 0 ;
d = a ;
return ;
}
exGcd (b, a%b, d, x, y) ;
lld tmp = x ;
x = y ;
y = tmp - a/b*y ;
}
LL qpow(LL a,LL b,LL c)
{
LL r=1;
while(b){
if(b&1) r=r*a%c;
a=a*a%c;
b>>=1;
}
return r;
}
int main()
{
LL p,q,e,n,fn,l;
lld d,x,y;
while(cin>>p>>q>>e>>l){n=p*q;
fn=(p-1)*(q-1);
exGcd(e,fn,d,x,y);
x=(x%fn+fn)%fn;
for(int i=1;i<=l;++i){
LL num;
scanf("%lld",&num);
printf("%c",qpow(num,x,n));
}cout<<endl;
}
return 0;
}