題目大意:給定乙個數n,問你這個數取多少次尤拉函式後變成1
題目型別:尤拉函式
input
test(資料數量),每組乙個m,接下來m個pi,qi,為n的標準分解形式
output
輸出test行整數
sample input
1 2sample output 題解2 23 1
注意到只有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 根據容斥...