【數學基礎】快速冪

首先,顧名思義,快速冪就是快速的冪php

不過可能有人曉得從math裏頭的pow(a,b),不過,這樣的快速冪是沒有靈魂的,咱們要本身敲代碼。html

本身手敲冪,最簡單的方法。代碼以下ios

1 int power(int a,int b)
2 {
3     int ans=1;
4     for(int i=1;i<=b;i++)
5     {
6         ans*=a;
7     }
8     return ans;
9 }

這個比較基礎的方法,的時間複雜度固然要比快速冪慢不少了,因此,咱們要嘗試下降時間複雜度。測試

開始前,不瞭解二進制和位運算符的請先來這裏——>傳送門spa

 

代碼以下code

 1 int qpow(int a, int b){
 2     int ans=1, base=a;
 3     while(b != 0){
 4         if (b%2)
 5             ans*=base;
 6         base*=base;
 7         b>>=1;
 8     }
 9     return ans;
10 }

代碼較短,很好理解。好比求a的11次方,只須要a1×a2×a8 就行了。htm

 

接下來,看幾道例題:blog

1615:【例 1】序列的第 k 個數

【題目描述】ci

BSNY 在學等差數列和等比數列,當已知前三項時,就能夠知道是等差數列仍是等比數列。如今給你序列的前三項,這個序列要麼是等差序列,要麼是等比序列,你能求出第 k 項的值嗎。 若是第 k 項的值太大,對 200907 取模。get

【輸入格式】

第一行一個整數 T,表示有 T 組測試數據;

對於每組測試數據,輸入前三項a,b,c,而後輸入 k。

【輸出格式】

對於每組數據輸出第 k 項的值,對 200907 取模。

【樣例輸入】

2
1 2 3 5
1 2 4 5

【樣例輸出】

5
16

一道考驗時間複雜度的題,找到規律就能夠解決了。

代碼以下

 1 #include<iostream>
 2 #define LL long long
 3 using namespace std;
 4 LL a, b, c, k, m=200907;
 5 LL ans, base;
 6 int T;
 7 LL qpow(LL a, LL b, LL m){
 8     LL ans=1, base=a;
 9     while(b != 0){
10         if (b%2){
11             ans*=base;
12             ans%=m;
13         } 
14         base*=base;
15         base%=m;
16         b>>=1;
17     }
18     return ans;
19 }
20 void solve(){
21     cin>>a>>b>>c>>k;
22     if (a-b == b-c){
23         ans=0;
24         ans+=(b-a)*(k-1)+a;
25         if (ans>m) ans%=m;
26     }
27     else{
28         base=(b/a)%m;
29         ans=a%m*qpow(base,k-1, m)%m;
30     }
31     cout<<ans<<endl;
32 }
33 int main()
34 {
35     cin>>T;
36     for (int i=1; i<=T; i++) solve();
37     return 0;
38 }

 

相關文章
相關標籤/搜索