果實計數

題目描述

淘淘家有棵奇怪的蘋果樹,這棵樹共有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);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章