數論 尤拉函式 HAOI2012 外星人

2021-09-26 00:05:06 字數 1232 閱讀 9556

題目大意:給定乙個數n,問你這個數取多少次尤拉函式後變成1

題目型別:尤拉函式

input

test(資料數量),每組乙個m,接下來m個pi,qi,為n的標準分解形式

output

輸出test行整數

sample input

1 2

2 23 1

sample output

題解

注意到只有phi[2]=1,所以每個數最終都是要經過phi[2]=1這一步變為1

而每一次做尤拉函式,根據尤拉函式的計算式可以看出:會產生乙個2,也必會消掉乙個2. 每個pi做一次尤拉函式,就變成了pi-1,而pi減1必為合數,除非pi為2,pi-1又分解為若干個pi的qi次方,繼續下去,直到pi為2,結束,則有多少個2,就需要多少次。 因此我們只需要算出原數n的質因子一共會產生多少個2即可 於是我們令f[i]表示i分解出了幾個2: i為質數,f[i] = f[i - 1];否則,f[i * prime[j] = f[i] + f[prime[j]]

另:如果一開始n為奇數,則ans需+ 1,因為變出2需要第一步。因為若開始是奇數,第一次做尤拉函式是不會消掉2的,且運作到中間不會出現沒有2的情況,因為pi為奇數,pi-1則必定為偶數,2一定會有的。

**

#include

typedef

long

long ll;

using

namespace std;

const ll m =

1e5+10;

ll f[m]

, prime[m/2]

,cnt =

0,test;

bool check[m]

;void

make_prime()

}}intmain()

printf

("%lld\n"

,ans);}

return0;

}

HAOI2012 外星人(尤拉函式 遞推)

給乙個數n,求它經過多少次取 phi 可以變成1 由於只有 varphi 和 varphi 為1,所以原數變成1的過程必經2,由 可知一次操作只能消掉乙個2,所以可以通過求出2的個數來求操作次數 設 f i 表示 i 變成1的過程中會生成的2的個數,有以下性質 i 為質數時,f i f 即質數 i ...

數論 HAOI2012 容易題

問題描述 為了使得大家高興,小q特意出個自認為的簡單題 easy 來滿足大家,這道簡單題是描述如下 有乙個數列a已知對於所有的a i 都是1 n的自然數,並且知道對於一些a i 不能取哪些值,我們定義乙個數列的積為該數列所有元素的乘積,要求你求出所有可能的數列的積的和 mod 1000000007的...

數論 尤拉函式

尤拉函式,用 n 表示 尤拉函式是求小於等於n的數中與n互質的數的數目 求n的尤拉函式時我們可以減去它的所有素數因子以及它的倍數 12 12 2 2 3 素數因子有2 3所以我們減掉2,3的倍數 2的倍數 2,4,6,8,10,12 3的倍數 3,6,9,12 顯然2,3存在重複項6,12 根據容斥...