E. Mocha and Stars
题意
给出 n 个区间 [li,ri] 和 m,保证 li⩽ri⩽m,求:
a1=l1∑r1a2=l2∑r2⋯an=ln∑rn[gcd(a1,a2,…,an)=1]⋅[a1+a2+⋯+an⩽m]
思路
可以使用Mobius反演转换 [gcd(a1,a2,⋯,an)=1],[a1+a2+⋯+an⩽m] 可以使用01背包解决(前缀和优化)。
下面推下式子:
===a1=l1∑r1a2=l2∑r2⋯an=ln∑rn[gcd(a1,a2,…,an)=1]⋅[a1+a2+⋯+an⩽m]a1=l1∑r1a2=l2∑r2⋯an=ln∑rnd∣gcd(a1,…,an)∑μ(d)⋅[a1+a2+⋯+an⩽m]d=1∑min(r1,r2,…,rn)μ(d)a1=⌈dl1⌉∑⌊dr1⌋⋯an=⌈dln⌉∑⌊drn⌋[a1d+a2d+⋯+and⩽m]d=1∑min(r1,r2,…,rn)μ(d)a1=⌈dl1⌉∑⌊dr1⌋⋯an=⌈dln⌉∑⌊drn⌋[a1+a2+⋯+an⩽⌊dm⌋]
考虑计算 a1=⌈dl1⌉∑⌊dr1⌋⋯an=⌈dln⌉∑⌊drn⌋[a1+a2+⋯+an⩽⌊dm⌋] 的复杂度。
这个式子可以通过01背包dp完成计算,设 f(i,j) 表示前i个物品,总重量和为j的方案数,转移为:
f(i,j)=k=li∑rif(i−1,j−k)
用前缀和优化后,dp总复杂度为 O(N⌊dM⌋)
则计算 d=1∑min(r1,r2,…,rn)μ(d)a1=⌈dl1⌉∑⌊dr1⌋⋯an=⌈dln⌉∑⌊drn⌋[a1+a2+⋯+an⩽⌊dm⌋]
直接枚举的总复杂度为 O(∑i=1MN⌊dM⌋)=O(NMlogM)。
如果使用数论分块的总复杂度为 O(NMlogM),但其实常数很大。
直接暴力枚举d:
点击显/隐代码
使用数论分块:
点击显/隐代码