HDU 1211 - RSA (欧几里得扩展 + 快速幂取模)
题意
给出计算公钥和密钥的公式,让解密。
思路
和之前的同名题一样,用欧几里得扩展和快速幂算出来。
代码
LL QuickMod(LL a, LL m, LL n)
{
LL ans = 1;
while (m)
{
if (m & 1) ans = ans * a % n;
a = a*a % n;
m >>= 1;
}
return ans;
}
void Extend_GCD(LL a, LL b, LL &d, LL &x, LL &y)
{
if (!b) d = a, x = 1, y = 0;
else { Extend_GCD(b, a%b, d, y, x); y -= x * (a/b); }
}
int main()
{
//ROP;
LL Q, P, E, l;
while (cin >> P >> Q >> E >> l)
{
LL FN = (P-1) * (Q-1), N = P * Q;
LL g, x, y;
Extend_GCD(E, FN, g, x, y);
x = (x%FN + FN) % FN;
string ans;
while (l--)
{
LL C;
cin >> C;
LL M = QuickMod(C, x, N);
ans += (char)M;
}
cout << ans << endl;
}
return 0;
}