ADV-1117 超級快速冪(數論)
阿新 • • 發佈:2022-03-04
問題描述
給出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
作者:inss!w! 出處:https://www.cnblogs.com/Hfolsvh/ 版權宣告:本部落格所有文章除特別宣告外,均採用 BY-NC-SA 許可協議。轉載請註明出處!#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; }