1. 程式人生 > >Luogu P1226 取余運算||快速冪(數論,分治)

Luogu P1226 取余運算||快速冪(數論,分治)

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:
2 10 9
輸出樣例#1:
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,所以這裏不需要在括號裏面%k
11 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 取余運算||快速冪(數論,分治)