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
1x2
k2x
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 會超時,這裡引入快速冪來...