原來是有一篇文的 但是latex渲染壓力夠大了不想加東西了 乾脆開個新坑
剛好之前xoi2003最後一題出了個被出爛的idea 算是提醒一下自己別再弄板子題了吧
說句閒話,碼農教程司馬
前置知識:
擴充套件尤拉定理: b≥φ
(p)時
,ab≡
abmo
dφ(p
)+φ(
p)(m
odp)
b\ge \varphi(p)時,a^b\equiv a^\pmod p
b≥φ(p)
時,ab
≡abm
odφ(
p)+φ
(p)(
modp
)(顯然 b
<φ(
p)
b<\varphi(p)
b<φ(
p)時無需變化)
題意:求 222
⋯mod
p\large 2^}}\bmod p
222⋯mo
dp的值就是板子,用擴充套件尤拉定理遞迴求解(也可轉化為遞推)即可
遞迴邊界就是 p=1
p=1p=
1 ,答案顯然為0
考慮這樣一件事:對於偶數 p
pp ,φ(p
)≤p2
\varphi(p)\le\dfrac p2
φ(p)≤2
p成立(偶數全部被排除);對於奇數 p
pp ,考慮計算公式:
φ (x
)=x×
∏i=1
m(1−
1pi)
\varphi(x)=x\times\prod\limits_^m(1-\dfrac 1)
φ(x)=x
×i=1
∏m(
1−pi
1)
( p1∼m
p_p1
∼m 為 x
xx 的質因子,x
xx 為奇數)
發現 1−1
pi=p
i−1p
i1-\dfrac 1=\dfrac
1−pi1
=pi
pi
−1 ,於是易 證 φ(x
)\varphi(x)
φ(x)
必為偶數(讀者自證不難)
那麼我們就發現遞迴(遞推)求解層數是log級的,時間複雜度就不虛了
我用線性篩預處理了一下 φ
\varphi
φ ,感覺直接爆算可能不怎麼快
反正時間複雜度是 θ(p
+t
logp)
\theta(p+t\log p)
θ(p+
tlogp)
,本題中 p=1
e7
p=1e7
p=1e7
寫**的時候突然意識到遞推並不好寫。。寫個遞迴算了 反正也不慢
qnmd線性篩
a掉之後翻了一下提交記錄 突然發現直接算尤拉函式速度會快很多
一方面是理論上運算次數少了 另一方面是沒有訪問陣列,常數也小了不少
所以還是放新**吧
#include
int t,s,a,cnt,p;
intphi
(int x)
x>1&&
(t=t/x*
(x-1))
;return t;
}inline
int_power
(int x,
int y,
int p)
intf
(int p)
intmain()
和上題很類似
坑回頭填
2016 12 7 關於尤拉函式
關於什麼是尤拉函式,以及一些非常簡單的尤拉函式,在此就不多加贅述。尤拉函式的基本性質 1.尤拉函式是積性函式,但不是完全積性函式,即 mn n m 只在 n,m 1時成立.2.對於乙個正整數n的素數冪分解n p1 q1 p2 q2 pn qn.則 n n 1 1 p1 1 1 p2 1 1 pn 3...
尤拉函式 尤拉定理
尤拉函式 對正整數 n,尤拉函式 是小於等於 n的數中與 n互質的數的數目 此函式以其首名研究者尤拉命名 euler so totientfunction 它又稱為 euler stotient function 函式 尤拉商數等。例如 8 4,因為 1,3,5,7均和8 互質。注 n為1時尤拉函式...
尤拉函式 尤拉定理
尤拉函式 設 n 為正整數,則 1,2,n 中與 n 互素的整數的個數計作 n 叫做尤拉函式。設 p 是素數,p p 1設 p 是素數,pa pa p a 1 設 p,q 是不同的素數,n q p,n p q 即 n p 1 q 1 設 m,n 是兩個正整數,且 m,n 1,若 n m n,n m ...