廣義高階冪取模(模板向)

2021-09-26 20:48:04 字數 2057 閱讀 2783

高階冪,或者叫冪塔,指的是乙個數冪次的冪次的冪次……,也就是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。所...