我们知道积性函数可以迪雷克卷积
我们知道F(x)=Σd|xf(d)
要求f(x)
两面卷上一个μ
得 F ∗ μ = f ∗ 1 ∗ μ F*μ=f*1*μ F∗μ=f∗1∗μ
得 F ∗ μ = f ∗ ( 1 ∗ μ ) F*μ=f*(1*μ) F∗μ=f∗(1∗μ)
得 F ∗ μ = f ∗ e F*μ=f*e F∗μ=f∗e
得 F ∗ μ = f F*μ=f F∗μ=f
也就是 f = Σ d ∣ x μ ( x / d ) f ( d ) f=Σd|x μ(x/d)f(d) f=Σd∣xμ(x/d)f(d)
其实就是应为简单的迪雷克卷积
而我们用的最多的就是 e ( x ) = [ x = = 1 ] e(x)=[x==1] e(x)=[x==1]了
也就是 Σ d ∣ x μ ( x / d ) Σd|x μ(x/d) Σd∣xμ(x/d)这个东西
我们需要求f(x)的前缀和F(x)
然而 n 有时达到 100000000
O(n) 就不可做了
我们需要一个O(n^3/4)的做法—杜教筛
我们找一个函数g(x)与f(x)的迪雷克卷积的前缀和很好求
则 f ∗ g ( n ) = Σ d ∣ n f ( d ) ∗ g ( n / d ) f*g(n)=Σd|n f(d)*g(n/d) f∗g(n)=Σd∣nf(d)∗g(n/d)
然后 Σ i = 1 n f ∗ g ( i ) = Σ i = 1 n Σ d ∣ i f ( i / d ) ∗ g ( d ) Σi=1~n f*g(i)=Σi=1~n Σd|i f(i/d)*g(d) Σi=1 nf∗g(i)=Σi=1 nΣd∣if(i/d)∗g(d)
然后先枚举d Σ i = 1 n f ∗ g ( i ) = Σ d = 1 n g ( d ) ∗ Σ d ∣ i f ( i / d ) Σi=1~n f*g(i)=Σd=1~n g(d)* Σd|i f(i/d) Σi=1 nf∗g(i)=Σd=1 ng(d)∗Σd∣if(i/d)
然后 Σ i = 1 n f ∗ g ( i ) = Σ d = 1 n g ( d ) ∗ Σ i = 1 n / d f ( i ) Σi=1~n f*g(i)=Σd=1~n g(d)* Σi=1~n/d f(i) Σi=1 nf∗g(i)=Σd=1 ng(d)∗Σi=1 n/df(i)
然后 Σ i = 1 n f ∗ g ( i ) = Σ d = 1 n g ( d ) ∗ F ( n / d ) Σi=1~n f*g(i)=Σd=1~n g(d)* F(n/d) Σi=1 nf∗g(i)=Σd=1 ng(d)∗F(n/d)
得 Σ i = 1 n f ∗ g ( i ) = g ( 1 ) ∗ F ( n ) + Σ d = 2 n g ( d ) ∗ F ( n / d ) Σi=1~n f*g(i)=g(1)*F(n)+Σd=2~n g(d)* F(n/d) Σi=1 nf∗g(i)=g(1)∗F(n)+Σd=2 ng(d)∗F(n/d)
移项,得 g ( 1 ) ∗ F ( n ) = Σ i = 1 n f ∗ g ( i ) − Σ d = 2 n g ( d ) ∗ F ( n / d ) g(1)*F(n)=Σi=1~n f*g(i)-Σd=2~n g(d)* F(n/d) g(1)∗F(n)=Σi=1 nf∗g(i)−Σd=2 ng(d)∗F(n/d)
然后(n/d)这个东西就可以除法分块了