メビウス反転の計算

他の人のコースウェア(qwq


問題:

既知の\(\ F(1))F(N- cdots \) および\(G = F * \ MU \) カウント\(G(1)\ cdots G(N-)を\)


解決策1

定義に従って、つまり\(g(n)= \ sum_ {d | n} f(d)\ mu(\ frac {n} d)\)に従って直接計算します。
コード(疑似):

for(int i=1; i<=n; ++i)
	for(int j=1; j<=n/i; ++j)
		g[i*j] += f[i] * mu[j];

複雑さは\(O(n \ log n)\)です。


解決策2
数論関数を定義する

\ [q_i(n)= \ begin {cases} 1 \ quad n = 1 \\ -1 \ quad n = p_i \\ 0 \ quad else \ end {cases} \]

ここで、\(p_i \)\(i \)素数です。
見つけることができます\(\ MU = Q_1 Q_2 * * * q_3 \ cdots \) そう\(G = F * Q_1 Q_2 * * * q_3 \ cdots \)

関数を\(q_i \)ロールインするには、\(O(\ frac {n} {p_i})\)しか必要としないため、全体の複雑度は\(\ sum_ {p \ leq n} \ frac { n} p = O(n \ log \ log n)\)

コード(疑似

for(int i=1; i<=n; ++i) g[i] = f[i];
for(int i=1; i<=pr_cnt; ++i)
	for(int j = n/prime[i]; j>0; --j) //这样算的原因类似0/1背包qwq
		g[j * prime[i]] -= g[j];

おすすめ

転載: www.cnblogs.com/tztqwq/p/12760647.html
おすすめ