高階冪,或者叫冪塔,指的是乙個數冪次的冪次的冪次……,也就是aaa
..
.a^}
aaa...
而廣義高階冪則指冪塔上存在不同的數,形如a0a
1a2.
..
a_0^}
a0a1a2
...
高階冪取模典型題目:codeforces 906d power tower
題目大意:就是上述的廣義高階冪去取模:給你n個數,q次查詢,每次給定乙個l和r,查詢這n個數中由區間[al
,ar]
[a_l, a_r]
[al,a
r]所組成的冪塔去模m的結果。
思路:尤拉降冪。
我們知道尤拉降冪的公式 nx≡
nxmo
dϕ(m
)+ϕ(
m)(m
odm)
ifx≥
ϕ(m)
n^x \equiv n^ \space (mod \space m)\quad if \space x \geq \phi(m)
nx≡nxm
odϕ(
m)+ϕ
(m)(
modm
)ifx
≥ϕ(m
)所以我們自定義乙個模運算:
#define mod
(a,b) ax≡n
mod(
x,ϕ(
m))(
modm
)n^x \equiv n^(mod \space m)
nx≡nmo
d(x,
ϕ(m)
)(mo
dm),該公式就在x為任意非負整數下適用了。
如此,冪塔就可以遞迴地將降冪進行下去,遞迴的過程會將φ函式迭代下去:
a 0a
1a2a
3...
modm
=a0m
od(a
1a2a
3...
,ϕ(m
))mo
dm=a
0mod
(a1m
od(a
2a3.
..,ϕ
(ϕ(m
))),
ϕ(m)
)mod
m...
..
.a_0^}}\space mod\space m\\=a_0^}, \phi(m))}\space mod\space m \\ = a_0^,\phi(\phi(m)))},\phi(m))}\space mod \space m\\ ......
a0a1a2
a3.
..
mod
m=a0
mod(
a1a2
a3.
..
,ϕ(m
))m
odm=
a0mo
d(a1
mod(
a2a3
...
,ϕ(
ϕ(m)
)),
ϕ(m)
)mo
dm..
....
**:
#include.h>
#define mod
(a,b) a#define ll long
long
#define n 100010
using namespace std;
ll n,q,mod,a[n]
;map
mp;ll qpow
(ll x,ll n,ll mod)
return res;}
ll phi
(ll k)
if(k >
1) s = s / k *
(k -1)
; mp[x]
=s;return s;}
ll solve
(ll l,ll r,ll mod)
intmain()
return0;
}
快速冪取模演算法 模板
快速冪取模其實是a b c,這就是著名的rsa公鑰加密的方法,當a,b都很大的時候,直接求是不可取的,所以就用到了快速冪取模。首先你得明白他的原理,其實是用到了二分的思想,把b按照二進位制展開 b p n 2 n p n 1 2 n 1 p 1 2 p 0 其中p i 0 i n 為 0 或 1。所...
快速冪取模演算法模板
在miller rabbin測試素數,就用到了快速冪取模的思想。這裡總結下。求a b c 這就是著名的rsa公鑰的加密方法 當a,b很大時,直接求解這個問題不太可能 演算法1 利用公式a b c a c b c,這樣每一步都進行這種處理,這就解決了a b可能太大存不下的問題,但這個演算法的時間複雜度...
快速冪取模演算法 模板
快速冪取模其實是a b c,這就是著名的rsa公鑰加密的方法,當a,b都很大的時候,直接求是不可取的,所以就用到了快速冪取模。首先你得明白他的原理,其實是用到了二分的思想,把b按照二進位制展開 b p n 2 n p n 1 2 n 1 p 1 2 p 0 其中p i 0 i n 為 0 或 1。所...