快速冪是什么?
顧名思義,快速冪就是快速算底數的n次冪。其時間復雜度為 O(log₂N), 與朴素的O(N)相比效率有了極大的提高。
就以a的b次方來介紹:
把b轉換成二進制數,該二進制數第i位的權為

例如:
11的二進制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我們將a¹¹轉化為算

如何編寫快速冪代碼?
以下是用C++語言編寫的兩種代碼,可供各位參考:
1 //快速冪1(數字較小): 2 #include<bits/stdc++.h> 3 using namespace std; 4 long long f(long long n,long long m) 5 { 6 //求的是m個n相乘,這里n是一個正整數 7 if(m==0)return 1; 8 else if(m==1)return n; 9 else if(m%2==0)return f(n*n,m/2);//偶數時的降冪 10 return f(n*n,m/2)*n;//奇數時的降冪 11 } 12 int main() 13 { 14 long long n,m; 15 cin>>n>>m; 16 cout<<f(n,m); 17 return 0; 18 }
1 //快速冪2(數字較大): 2 #include<bits/stdc++.h> 3 using namespace std; 4 int k; 5 long long f(long long n,long long m) 6 { 7 //求的是m個n相乘,這里n是一個正整數 8 if(m==0)return 1; 9 else if(m==1)return n%k; 10 else if(m%2==0)return f((n%k)*(n%k),m/2)%k;//偶數時的降冪 11 return f((n%k)*(n%k),m/2)*(n%k)%k;//奇數時的降冪 12 } 13 int main() 14 { 15 long long n,m; 16 cin>>n>>m>>k; 17 cout<<f(n,m); 18 return 0; 19 }
記住一點:數字較大的時候只要把原先的程序能模(%)的都模掉,否則數據太大,容易報表!
下面給大家一道題提升一下,如果大家有想法,可以私信我哦!(下期告訴大家參考答案)
題目描述 Description
有n頭奶牛住在n個環形的牛圈,奶牛編號為0到n-1,牛圈編號也為0到n-1,i號牛住在第i號牛圈。
現在牛們想實施住宅滾動制度。每滾動一次,第0號圈的奶牛會順時針搬到第m號牛圈中,第1號圈的奶牛會順時針搬到第1+m號牛圈中,...,第n-m號圈的奶牛會順時針搬到0號牛圈,
也就是說原來的第i號牛圈的奶牛會順時針搬到i+m號牛圈。
試判斷,進行了10^k輪滾動后,原來在x號圈的奶牛現在在幾號牛圈。
輸入描述 Input Description
一行,四個正整數,n m k x
輸出描述 Output Description
10^k輪后,最初在第x個圈的奶牛所處牛圈的編號
樣例輸入 Sample Input
10 3 4 5
樣例輸出 Sample Output
5
數據范圍及提示 Data Size & Hint
對於 30%的數據,0 < k < 7;
對於 80%的數據,0 < k < 10^7;
對於 100%的數據,1 < n < 1,000,000,0 < m < n,1 <= x <=n,0 < k < 10^9。