題意:已知$x$,求出$phi(n)==x$的最小$n$。
不得不說今天刷了一堆(相對而言)思博大爆搜之後來這麼一道相對有思考價值的數學題真是強啊……
首先我們需要記住乙個基本事實:在$int$範圍內,每個數的同乙個質因數不會成為這個數字的$31$次方,乙個數存在的不同質因數不會超過$10$個。
理由很簡單:首先$int_max==2147483647$,一定沒有任何乙個質數$31$次方小於這個數;至於第二個嘛……
這個東西說明了一切……
了解到這個之後,我們再回顧一下尤拉函式的性質,最重要的一點就在於:它是乙個積性函式。於是我們就可以對著乙個合數進行三種分類討論:
1)他自己就是乙個質數的尤拉函式,那這個質數一定是他再加$1$;
2)他是幾個質數乘積,就遞迴搞下去。
那麼我們就爆搜就可以了。預處理出$sqrt(2147483647)$範圍內的質數,然後利用這些掃來掃去,最後特判剩下的是不是質數即可。還有乙個優化點:可以證明選擇的質數一定是遞增的,因此直接遞增計算即可。
1 #include2 #include3 #include4 #include5 #include6bzoj3643using
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()
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...