二分法,時間複雜度 o(logn)
用兩個模版,非遞迴的用時少,但是不太理解。。。
好吧,等比數列又名幾何數列 等差數列又名算術序列 arithmetic or geometric sequences
兩個最基本公式:(a*b)%c = ((a%c)*(b%c))%c 和 (a+b)%c = ((a%c)+(b%c))%c
遞迴
// 15ms#include#include#include#include#define ll __int64 //這樣定義長整型
#define mod 200907
using namespace std;
int qmod(ll a,int n) //快速冪取模 遞迴模版
int main()
printf("%d\n",ans);
}return 0;
}
非遞迴
// 0ms#include#include#include#include#define ll __int64
#define mod 200907
using namespace std;
ll qmod(ll x,ll n) //快速冪取模 非遞迴模版
x=(x*x)%mod;
n=n/2;
}return sum;
}int main()
printf("%d\n",ans);
}return 0;
}
想到了等比數列求和
就是提取公因式
求等比數列1+pi+pi^2+pi^3+...+pi^n可以由遞迴形式的二分求得:(模運算不能用等比數列和公式!)
若n為奇數,一共有偶數項,則:
1 + p + p^2 + p^3 +...+ p^n
= (1+p^(n/2+1)) + p * (1+p^(n/2+1)) +...+ p^(n/2) * (1+p^(n/2+1))
= (1 + p + p^2 +...+ p^(n/2)) * (1 + p^(n/2+1))
如:1 + p + p^2 + p^3 + p^4 + p^5 = (1 + p + p^2) * (1 + p^3)
若n為偶數,一共有奇數項,則:
1 + p + p^2 + p^3 +...+ p^n
= (1+p^(n/2+1)) + p * (1+p^(n/2+1)) +...+ p^(n/2-1) * (1+p^(n/2+1)) + p^(n/2)
= (1 + p + p^2 +...+ p^(n/2-1)) * (1+p^(n/2+1)) + p^(n/2);
如:1 + p + p^2 + p^3 + p^4 = (1 + p) * (1 + p^3) + p^2
快速冪 快速冪取模
快速冪的思想在於快速求解高冪指數的冪運算 複雜度為o log2n 與樸素運算相比有很大的改進 接下來給出 其中有詳解 include include using namespace std typedef long long ll ll pow1 int a,int b 最常規的方法 將冪指數轉化為...
快速冪 快速冪取模
求x m 一般方法是 xm x xm 1,這樣需要做m次乘法,未免過慢。加速方法有兩種。1.基於當m為偶數時,xm x2 m 2 當m為奇數時,xm x xm 1。顯然當m為偶數時m會減半,當m為奇數時,下次就是偶數。m可以很快收斂到0.表示冪 2.將m看成二進位制串mkmk 1 m1m0,那麼xm...
快速冪 快速冪取模
原文 快速冪這個東西比較好理解,但實現起來到不老好辦,記了幾次老是忘,今天把它系統的總結一下防止忘記。首先,快速冪的目的就是做到快速求冪,假設我們要求a b,按照樸素演算法就是把a連乘b次,這樣一來時間複雜度是o b 也即是o n 級別,快速冪能做到o logn 快了好多好多。它的原理如下 假設我們...