題目描述
淘淘家有棵奇怪的蘋果樹,這棵樹共有n+1層,標號爲0~n。這棵樹第0層只有一個節點,爲根節點。已知這棵樹爲b叉樹,且保證是一顆滿b叉樹。如圖爲一顆滿3叉樹。
現在,該樹第n層的每個節點上都結出了一個蘋果,淘淘想知道共結了多少蘋果。由於數量可能很大,答案要求輸出mod k後的結果。
輸入
給出第1層的節點數b和層數n和k.
輸出
輸出蘋果數mod k後的結果。
樣例輸入
2 10 9
樣例輸出
7
提示
30%的數據保證:b<=100,n<=10, k<=100.
100%的數據保證:b<2^31,n<2^31,k<=2^15.
題解:題目看起來很簡單,做起來只需要知道快速冪的方法也很簡單;
所謂快速冪也就是按照二進制的方法去縮短次方運算的時間O(logn);
例如a^11,11可化爲二進制1011(即2^0+2^1+2^3),所以a^11可化爲a^(2^0)*a^(2^1)*a^(2^3),由1011可以看出規律當二進制位上爲一時可將答案與累乘的a相乘,所以讓a不斷乘以自身,當次方的當前二進制數爲一時用累乘的a與ans相乘,再將次方的二進制位抹去一位;
“>>”,移位運算符,將值的按二進制向右移動一位,出列的一位抹去;
#include<stdio.h>
int main()
{
long long int ans=1,b,n,k,i;
scanf("%lld %lld %lld",&b,&n,&k);
while(n!=0)
{
if(n&1)
ans=ans*b%k;
b=b*b%k;
n>>=1;
}
printf("%lld\n",ans);
}