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;
}

Powered by Jekyll and Theme by solid