題意:
給定n,求尤拉函式前n項和。
資料範圍:n<=2e9
解法:尤拉函式性質:∑d∣
nφ(d
)=
n\sum_φ(d)=n
∑d∣nφ
(d)=
n轉化為卷積形式:φ∗i
=i
dφ*i=id
φ∗i=id
杜教篩遞推式:g(1
)s(n
)=∑i
=1n(
f∗g)
(i)−
∑i=2
ng(i
)s(⌊
ni⌋)
g(1)s(n)=\sum_^n(f*g)(i)-\sum_^ng(i)s(\lfloor \frac ni \rfloor)
g(1)s(
n)=∑
i=1n
(f∗
g)(i
)−∑i
=2n
g(i)
s(⌊i
n⌋)
令f =φ
,g=i
f=φ,g=i
f=φ,g=
i,上式變為:s(n
)=n∗
(n+1
)2−∑
i=2n
s(⌊n
i⌋
)s(n)=\frac -\sum_^ns(\lfloor \frac ni \rfloor)
s(n)=2
n∗(n
+1)
−∑i=
2ns
(⌊in
⌋)前半部分o(1)計算,後半部分整除分塊遞迴計算。
code:
#include
using
namespace std;
#define ll long long
const
int maxm=
1e6+5;
ll phi[maxm]
;ll notprime[maxm]
;ll prime[maxm]
,cnt;
ll sum_phi[maxm]
;void
init()
for(
int j=
0;jfor(
int i=
1;imapmp_phi;
ll s_phi
(ll x)
return mp_phi[x]
=ans;
}signed
main()
BZOJ 4805 尤拉函式求和 杜教篩
複習一下杜教篩 所有除法向下取整 公式 s n frac f g i sum g i s frac 應用時一定要滿足 sum f g i 要能夠快速求出,且 f,g 都為積性函式.其中 f g i sum 就是 f,g 的迪利克雷卷積 常見的變換 證明就不給了 一些定義 i x 1,id x x,e...
BZOJ4805 尤拉函式求和
bzoj4805 尤拉函式求和 給出乙個數字n,求sigma phi i 1 i n 正整數n。n 2 10 9 輸出答案。1032 題目要求 sum n varphi i 這。不是很顯然乙個線性篩然後字首和就沒了麼?水題?並不!n leq 2 times 10 9 直接 tle 到 怎麼辦?沒事,...
BZOJ4805 尤拉函式求和
題目大意 對於給定的 n n leq2 times10 9 求 sum n varphi i 思路 設 s n sum n varphi i 因為 sum varphi d n s n sum n i sum 13const int n 1587402,m 120256 14 bool vis n ...