bzoj3643 Phi的反函式 數學 搜尋

2022-03-27 02:32:30 字數 1320 閱讀 6155

題意:已知$x$,求出$phi(n)==x$的最小$n$。

不得不說今天刷了一堆(相對而言)思博大爆搜之後來這麼一道相對有思考價值的數學題真是強啊……

首先我們需要記住乙個基本事實:在$int$範圍內,每個數的同乙個質因數不會成為這個數字的$31$次方,乙個數存在的不同質因數不會超過$10$個。

理由很簡單:首先$int_max==2147483647$,一定沒有任何乙個質數$31$次方小於這個數;至於第二個嘛……

這個東西說明了一切……

了解到這個之後,我們再回顧一下尤拉函式的性質,最重要的一點就在於:它是乙個積性函式。於是我們就可以對著乙個合數進行三種分類討論:

1)他自己就是乙個質數的尤拉函式,那這個質數一定是他再加$1$;

2)他是幾個質數乘積,就遞迴搞下去。

那麼我們就爆搜就可以了。預處理出$sqrt(2147483647)$範圍內的質數,然後利用這些掃來掃去,最後特判剩下的是不是質數即可。還有乙個優化點:可以證明選擇的質數一定是遞增的,因此直接遞增計算即可。

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7const

int maxn=50000;8

int prime[maxn],tot,n;bool notprime[maxn]=;

9void

shaisushu()

1019}20

}21long

long pro=1;long

long ans=2147483648ll;int

mudi;

22bool isprime(int

x)23

29void dfs(int now,int

num)

3034

if(now>mudi&&isprime(now+1)==1)ans=min(ans,pro*1ll*(now+1

));35

if(prime[num]-1>mudi||now1)return;36

for(int i=num;prime[i]<=mudi+1;i++)

3748 pro=tpro,now=tt;49}

50}51}

52int

haha()

5358

int sb=haha();

59int main()

bzoj3643

BZOJ 3643 Phi的反函式

by zky 尤拉函式 思路 dfs ans一定是a1 b1 a2 b2 ak bk,所以n一定是a1 b1 1 a2 b2 1 ak bk 1 a1 1 a2 1 ak 1 這樣,我們就可以dfs有哪些質數是a,然後用n除以它們 1後再看是不是ak b1 1 相乘的形式。如果在外面定義了ij,就不...

BZOJ3643 Phi的反函式(數論 dfs)

這裡放傳送門 這題記得某天學長出過胡策。然後一臉懵逼 這玩意兒也能求?這題用到了乙個非常常用非常重要的性質 對於long long級別的數字,它不同的質因子個數非常小,最多不會超過15個。因為最小的十來個質數乘起來就已經變得很大了。這就說明我們可以用爆搜來搞這個東西。對於這道題來說我們知道乙個數的p...

BZOJ3643 尤拉函式,搜尋

給定乙個數x,我們可以求出phi x 那給定乙個數k k 1e6 如何求出phi x k的解呢 容易知道k為奇數時唯有k 1有解x 1,其餘無解 假設n有素冪因子分解 n cdots 因為 phi x prod limits p j 1 所以 1由此篩選出一些質數,同時記錄它的最高冪次 然後用dfs...