Carmichael Numbers 快速冪運算

2021-10-08 15:30:10 字數 2189 閱讀 1457

carmichael numbers

我們把對任意的 1

<

x<

n1 < x < n

1<

x<

n 都有 xn≡

x(mo

dn

)x^n\equiv x(mod\quad n)

xn≡x(m

odn)

成立的合數n

nn稱為carmichael number。對於給定的整數n

nn,請判斷它是不是carmichael number。

限制條件 輸入

17

1717

輸出no(17是素數)

樣例2

輸入561

56156

1輸出yes樣例3輸入4

44輸出

no(24≡

0(mo

d4

2^4 \equiv0 (\quad mod4

24≡0(m

od4) )

題解

此題中,有 n

nn 個待檢查的書,如果每個數都按定義o(n

)o(n)

o(n)

複雜度來計算冪,則總的負責的為o(n

3)

o(n^3)

o(n3

),時間複雜度太高,過不了。我們來介紹快速冪的方法。如果 n=2

kn=2^k

n=2k

,可以將其表示為:

x n=

((x2

)2)⋯

x^n=((x^2)^2)\cdots

xn=((x

2)2)

⋯只要做 k 次平方運算就可以輕鬆求得。由此我們可以想到,先將 n 表示為 2 的冪次的和。(可以結合該數的二進位制形式來理解)

n =2

k1+2

k2+2

k3+⋯

n=2^+2^+2^+\cdots

n=2k1​

+2k2

​+2k

3​+⋯

就有xn=x

2k1x

2k2x

2k3⋯

x^n=x^}x^}x^}\cdots

xn=x2k

1​x2

k2​x

2k3​

⋯只要在依次求出 x2i

x^x2

i的同時進行計算就行了,最終得到o(l

ogn)

o(logn)

o(logn

)計算快速冪運算的演算法。

核心**:

typedef

long

long ll;

ll res =1;

while

(n>0)

printf

("%lld"

,res)

;

我們通過乙個例項來消化一下:

x 22=

x16×x

4×x2

x^=x^\times x^ \times x^2

x22=x1

6×x4

×x2解釋一下式子的來由:

因為,22 的二進位制形式是 10110 (從最右邊開始,第1位是第0位),我們看到「10110」該數的第1位、第2位、第四位都不為0,即代表,22 可以由 21+

22+2

42^1+2^2+2^4

21+22+

24來構成,這也就對應了上面的公式,同時也是對應了**中的:

if

(n &

1) res = res * x % k;

當 n 的值每右移一位(n >>= 1),我們都判斷一下,如果它的最低為上面是1,我們就乘上 x2i

x^x2

i。至於為什麼這樣分步來對 k 來取模運算得到的答案是和結果相同的,可以去熟悉取模的基本運算規則(運算規則放在了文末)。

上面的程式還沒有完全做完(我們只重點介紹快速冪的思想),還有加上乙個素數判斷的部分,判斷素數可以打表也可以直接判斷,最後如果不是素數,並且上面**對 k 的取模運算等於 x 自身對 k 的取模運算,那麼輸出 yes。

學完鞏固題:p1226 【模板】快速冪||取餘運算

快速冪 普通快速冪 矩陣快速冪

題意 n個人排隊,f表示女,m表示男,包含子串 fmf 和 fff 的序列為o佇列,否則為e佇列,有多少個序列為e佇列。分析 矩陣快速冪入門題。下面引用巨巨解釋 用f n 表示n個人滿足條件的結果,那麼如果最後乙個人是m的話,那麼前n 1個滿足條件即可,就是f n 1 如果最後乙個是f那麼這個還無法...

快速冪(整數快速冪 矩陣快速冪)

1 整數快速冪 例如求x 8 就是x x x x x x x x 正常的運算方式是,x的值乙個個往上乘上去,乘法運算執行7次 x x x x x x x x 也可以採用這種運算方式,先進行乘法得到x 2再對x 2進行三次乘法。這種運算要明顯比第一種情況要快 所以對於整數快速冪,也是結合了這種思想 x...

快速冪(矩陣快速冪)

求 3 0 3 1 3 n mod 1000000007 input 輸入乙個數n 0 n 10 9 output 輸出 計算結果 sample input 3sample output 40 分析 利用等比數列的求和公式得所求和是 3 n 1 1 2,如果暴力求3 n 1 會超時,這裡引入快速冪來...