已知n,求phi(n)
正整數n。n<=10^18
輸出phi(n)84
很明顯,這樣的題就是一道十分簡單的入門題。只是n比較大,但輸入和輸出都還沒有爆long long。如果輸入高精度數,那
就很噁心了(雖然可以定義大整數類big int)。
phi[n]=n∏(1-(1/p)),所以是miller-rabin和pollard-rho演算法,用來分解乙個大數的質因子。
當n較小的時候,若要算出所有的phi(i),那麼尤拉篩明顯是最優的,線性空間線性時間。
若只需算出固定n對應的字首和∑phi(i),那很明顯,不必算出所有的phi(i)。
對於這種字首和∑f(i)的計算,若使用杜教「篩」(這並不是素數篩),需要構造乙個h=f*g(*指狄利克雷卷積),且字首和
∑g(i)與字首和∑h(i)可以十分方便地算出。然後經過一系列較為方便的演算,做到大事化小遞迴求解。如果預先打表o(n^(2/3)),此時複雜度最優為o(n^(2/3))。
我們可以發現,杜教篩對f的要求很苛刻。但是,洲閣篩使用了完全不同的思路。只要f(i)是多項式的,那麼我們可以想到類似dp的方法。這樣原始是o(n^(3/2))即o(n*sqrt(n))的,但通過各種優化可以壓至o(n^(3/4)/log n)的級別。
最後,說一下此題的方法。
摘自:遺憾的是,存在carmichael數:你無論取多少個a,有乙個不滿足,算我輸。
比如:561 = 11*51就是乙個carmichael數。
那麼,額。。所以我們需要改進演算法。
首先有:如果p是素數,x是小於p的正整數,且x^2 mod p = 1,那麼要麼x=1,要麼x=p-1
(這個廢話,x=p-1模意義下等於x=-1)
然後我們可以展示下341滿足2^340 mod 341 = 1,卻不是素數(341=31*11)的原因:
2^340 mod 341 = 1
2^170 mod 341 = 1
2^85 mod 341 = 32
(32這個數很那啥啊怎麼不等於340也不等於1啊。。這明顯有內幕嘛32*32=1024,1024=341*3+1)
那麼就能說明這個數不是素數。
如果是素數,一定是從p-1變到1,或是把所有2的次冪去除完,本來就等於1(這樣平方完就一直是1了)
所以要麼把所有2的次冪去除完,本來就等於1,要麼存在某乙個次冪=p-1(這樣就正常多了)
這就是miller-rabin素數驗證的二次探測。
應該來說miller-rabin演算法也是挺好寫的
其中mul(a,b,c)表示a*b%c(因為a*b會爆longlong,所以用快速加)
如果現在拆分的是n:pollard-rho(n)
主要流程:miller-rabin判斷是否質數,是返回,否就試圖找出其中乙個因子d,然後遞迴做pollard-rho(d)和pollard-rho(n/d)。
bzoj4173(尤拉函式)
資料大 10 15次方 公式複雜 不知道怎麼化簡 然後,感覺滿足打表找規律,發現sigema phi k k屬於s n,m n m。再求兩個phi就好,注意在括號裡面mod之後,需要在括號外面再mod一次,否則會wa。標準證明 總結1 很多的問題,通過小範圍資料打表,是非常便於幫助分析題目的性質的,...
bzoj 2818 尤拉函式
思路 就是對於某個數q,跟他互質的數p,kp和kq的最大公約數是k,那麼這個數能組成的答案的數量就是phi i 乘以某個質數,且乘積小於n 基於這種思路寫下這個 include include include include include include include include inclu...
尤拉函式 尤拉定理
尤拉函式 對正整數 n,尤拉函式 是小於等於 n的數中與 n互質的數的數目 此函式以其首名研究者尤拉命名 euler so totientfunction 它又稱為 euler stotient function 函式 尤拉商數等。例如 8 4,因為 1,3,5,7均和8 互質。注 n為1時尤拉函式...