基準時間限制:3 秒 空間限制:131072 kb 分值: 320 難度:7級演算法題
莫比烏斯函式,由德國數學家和天文學家莫比烏斯提出。梅滕斯(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定義:m(
n)=∑
ni=1
μ(i)
由於: 1=
∑i=1
n[i=
1]=∑
i=1n
∑d|i
μ(d)
=∑i=
1n∑d
=1⌊n
i⌋μ(
d)=∑
i=1n
m(⌊n
i⌋)
可以得到: m(
n)=1
−∑i=
2nm(
⌊ni⌋
) 問題可在o(
n2/3
) 時間複雜度下解決。
#pragma gcc optimize ("o2")
#include
#include
using
namespace
std;
typedef
long
long ll;
const
int maxn = 1e7 + 5;
int mu[maxn], prm[maxn], m[maxn], sz;
void init()
m[i] = m[i-1] + mu[i];
for(int j = 0; j < sz; ++j) else }}
}unordered_map
int> mp;
inline
int sm(ll n)
if(mp[n])
while(l <= n)
return mp[n] = res;
}int main()
return
0;}
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 莫比烏斯函式之和
莫比烏斯函式,由德國數學家和天文學家莫比烏斯提出。梅滕斯 mertens 首先使用 n miu n 作為莫比烏斯函式的記號。具體定義如下 如果乙個數包含平方因子,那麼miu n 0。例如 miu 4 miu 12 miu 18 0。如果乙個數不包含平方因子,並且有k個不同的質因子,那麼miu n 1...
51nod1244 莫比烏斯函式之和
莫比烏斯函式,由德國數學家和天文學家莫比烏斯提出。梅滕斯 mertens 首先使用 n miu n 作為莫比烏斯函式的記號。具體定義如下 如果乙個數包含平方因子,那麼miu n 0。例如 miu 4 miu 12 miu 18 0。如果乙個數不包含平方因子,並且有k個不同的質因子,那麼miu n 1...