Luogu P1226 取余運算||快速冪(數論,分治)
阿新 • • 發佈:2017-08-18
span 水題 spa 數論 urn 等於 註意 nbsp int
P1226 取余運算||快速冪
題目描述
輸入b,p,k的值,求b^p mod k的值。其中b,p,k*k為長整型數。
輸入輸出格式
輸入格式:
三個整數b,p,k.
輸出格式:
輸出“b^p mod k=s”
s為運算結果
輸入輸出樣例
輸入樣例#1:輸出樣例#1:2 10 9
2^10 mod 9=7
這是一道很有趣的水題,如果知道公式。
一般求解會溢出,導致答案錯誤。
這裏介紹取模的一個公式: a*b%k=(a%k)*(b%k)%k.
在我們這道題中是b^p = (b^(p/2)%k) * (b^(p/2) %k)%k
可以看出來運用的是分治的思維。那麽一只分解到p == 1時就能夠返回了。
蛤?你說p等於奇數時候? 那就把那個奇數再挑出來唄。 b^p = b * b^(p/2) * b^(p/2)
1 #include <cstdio> 2 3 long long b, k; 4 5 long long fff(long long p) 6 { 7 if(p == 1) //p等於1時 b^p%k = b%k; 8 return b%k; 9 long long temp = fff(p/2); //分~ 10 temp = (temp*temp)%k; //註意上面p==1時已經%k,所以這裏不需要在括號裏面%k11 if(p&1) //如果p等於奇數 12 temp = (temp*b)%k; 13 return temp; 14 } 15 16 int main() 17 { 18 long long p; 19 scanf("%lld%lld%lld", &b, &p, &k); 20 long long ans = fff(p); 21 printf("%lld^%lld mod %lld=%lld", b, p, k, ans); 22 23 return 0; 24 }
Luogu P1226 取余運算||快速冪(數論,分治)