HDU 2817 快速冪取模

2022-08-09 02:06:12 字數 1391 閱讀 5293

二分法,時間複雜度 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 快了好多好多。它的原理如下 假設我們...