1. 程式人生 > 其它 >ADV-1117 超級快速冪(數論)

ADV-1117 超級快速冪(數論)

問題描述

  給出a,b,c。令p=1000000007, z=b^c, y=a^z, x=y mod p。請求出x。

輸入格式

  三個整數分別是a,b,c

輸出格式

  請輸出x

資料規模和約定

  abc都不超過10^9

思路

不能使用a^(b^c%mod)%mod
考慮費馬小定理
當a和p互質時, a ^ (p - 1) % p = 1
最後的結論是a^(b^c) % mod = a^(b^c%(mod - 1)) % mod
先是一個結論:a = b * (a / b) + a % b
div = (b ^ c) / (mod - 1) rem = (b ^ c) % (mod - 1)
a^(b^c) % mod = a ^ ((mod - 1) * div + rem) % mod


由於a小於1e9,mod=1e9+7, mod是質數,a和mod互質,滿足費馬小定理
所以,a^(b^c) % mod = a ^ rem % mod

#include <iostream>

using namespace std;

const int p = 1000000007;
typedef long long LL;

int qmi(int a, int k, int mod)
{
    int res = 1;
    while(k)
    {
        if(k & 1)
        {
            res = (LL)res * a % mod;
        }
        a = (LL)a * a % mod;
        k >>= 1;
    }
    return res;
}

int main()
{
    int a, b, c;
    cin >> a >> b >> c;
    int z = qmi(b, c, p - 1);
    int y = qmi(a, z, p);
    cout << y;
    return 0;
}
作者:inss!w! 出處:https://www.cnblogs.com/Hfolsvh/ 版權宣告:本部落格所有文章除特別宣告外,均採用 BY-NC-SA 許可協議。轉載請註明出處!