莫比烏斯函式,由德國數學家和天文學家莫比烏斯提出。梅滕斯(mertens)首先使用μ(n)(miu(n))作為莫比烏斯函式的記號。具體定義如下:
如果乙個數包含平方因子,那麼miu(n) = 0。例如:miu(4), miu(12), miu(18) = 0。
如果乙個數不包含平方因子,並且有k個不同的質因子,那麼miu(n) = (-1)^k。例如:miu(2), miu(3), miu(30) = -1,miu(1), miu(6), miu(10) = 1。
給出乙個區間[a,b],s(a,b) = miu(a) + miu(a + 1) + … miu(b)。
例如:s(3, 10) = miu(3) + miu(4) + miu(5) + miu(6) + miu(7) + miu(8) + miu(9) + miu(10)
= -1 + 0 + -1 + 1 + -1 + 0 + 0 + 1 = -1。
輸入包括兩個數a, b,中間用空格分隔(2 <= a <= b <= 10^10)
輸出s(a, b)。
3 10
-1此題為求出區間 [a,
b]
[a,b]
[a,b
] 之間的莫比烏斯函式之和,顯然 ∑i=
abμ(
i)=∑
i=1b
μ(i)
−∑i=
1aμ(
i)
\sum\limits_^ \mu(i) =\sum\limits_^ \mu(i) - \sum\limits_^ \mu(i)
i=a∑b
μ(i)
=i=1
∑bμ
(i)−
i=1∑
aμ(
i),所以我們只需對 n
nn 求出 ∑i=
1nμ(
i)
\sum\limits_^ \mu(i)
i=1∑n
μ(i)
即可而莫比烏斯函式 μ
\muμ 我們已知為積性函式,求積性函式的字首和那麼顯然就用杜教篩來求啦
杜教篩的學習可以參考杜教篩用於在低於線性的時間複雜度內求出一些積性函式的字首和
現在我們需要求出積性函式 μ
\muμ 的字首和,考慮莫比烏斯函式的性質 μ∗i
=ϵ
\mu \ast i = \epsilon
μ∗i=
ϵ ( ∗
\ast
∗ 為狄利克雷卷積)
根據杜教篩的核心式就有
∑ i=
1nμ(
i)=∑
i=1n
(μ(i
)∗i(
i))−
∑i=2
ni(i
)∑j=
1⌊ni
⌋μ(j
)=∑i
=1nϵ
(i)−
∑i=2
ni(i
)∑j=
1⌊ni
⌋μ(j
)\sum\limits_^\mu(i) = \sum\limits_^(\mu(i) \ast i(i))-\sum\limits_^i(i)\sum\limits_^ \rfloor}\mu(j)\\\\ = \sum\limits_^\epsilon(i)-\sum\limits_^i(i)\sum\limits_^ \rfloor}\mu(j)
i=1∑n
μ(i)
=i=1
∑n(
μ(i)
∗i(i
))−i
=2∑n
i(i
)j=1
∑⌊in
⌋μ
(j)=
i=1∑
nϵ(
i)−i
=2∑n
i(i
)j=1
∑⌊in
⌋μ
(j)顯然其中 ϵ
\epsilon
ϵ 與 i
ii 的字首和很好求,再用整除分塊和記憶化搜尋優化一下就可以了
#include
using
namespace std;
typedef
long
long ll;
const
int maxn =
5e6+5;
bool isprime[maxn]
;int tot;
int prime[maxn]
;int mu[maxn]
;ll prefixmu[maxn]
;void
sieve()
for(
int j =
0; j < tot && i * prime[j]
< maxn;
++j)
mu[i * prime[j]]=
-mu[i];}
}for
(int i =
1; i < maxn;
++i) prefixmu[i]
= prefixmu[i -1]
+ mu[i];}
map summu;
ll sigmamu
(ll key)
summu[key]
= ans;
return summu[key];}
ll a, b;
intmain
(int argc,
char
*ar**)
51nod1244 莫比烏斯函式之和
求 i lr i l,r 10 10設m n i 1 n i 我們知道,d n d n 1 那麼1 i 1 n d i d t 1n d t d i 1n d 1 ni d i 1 nm ni 於是,m n 1 i 2nm ni 後面的東西可以用分塊來加速。然後打上記憶化標記。或者可以先預處理出一段...
51NOD 1244 莫比烏斯函式之和
基準時間限制 3 秒 空間限制 131072 kb 分值 320 難度 7級演算法題 莫比烏斯函式,由德國數學家和天文學家莫比烏斯提出。梅滕斯 mertens 首先使用 n miu n 作為莫比烏斯函式的記號。具體定義如下 如果乙個數包含平方因子,那麼miu n 0。例如 miu 4 miu 12 ...
51nod 1244 莫比烏斯函式之和
莫比烏斯函式,由德國數學家和天文學家莫比烏斯提出。梅滕斯 mertens 首先使用 n miu n 作為莫比烏斯函式的記號。具體定義如下 如果乙個數包含平方因子,那麼miu n 0。例如 miu 4 miu 12 miu 18 0。如果乙個數不包含平方因子,並且有k個不同的質因子,那麼miu n 1...