51nod 1244 莫比烏斯函式之和

2021-08-04 23:27:28 字數 1969 閱讀 7719

莫比烏斯函式,由德國數學家和天文學家莫比烏斯提出。梅滕斯(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
對於區間和我們可以將其分解為兩個字首和的差

∑ri=

lμ(i

) 我們設 m(

n)=∑

ni=1

μ(i)

已知 ∑d|

nμ(d

)=[n

=1] (當 n=

1 時結果為

1 ,其餘為 0)

所以有 ∑n

i=1∑

d|iμ

(d)=

∑ni=

1∑⌊n

i⌋d=

1μ(d

)=∑n

i=1m

(⌊ni

⌋)=1

因為 ∑ni

=1m(

⌊ni⌋

)=m(

n)+∑

ni=2

m(⌊n

i⌋)=

1 所以 m(

n)=1

−∑ni

=2m(

⌊ni⌋

) 然後就可以根據這個式子遞迴得出結果咯~

需要注意時間上的優化:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef __int64 ll;

typedef pair p;

const

int maxn = 5000000;

const

int mod = 1e5+7;

map mp[mod];

bool check[maxn];

int prime[maxn];

int mu[maxn];

void moblus()

for(int j=0; jint num=i*prime[j];

check[num]=true;

if(i%prime[j]==0)

else

mu[num]=-mu[i];}}

for(int i=2; i1];

}int call(ll x)

mp[x%mod][x]=p(ans,true);

return ans;

}int main()

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 ...

51nod1244 莫比烏斯函式之和

莫比烏斯函式,由德國數學家和天文學家莫比烏斯提出。梅滕斯 mertens 首先使用 n miu n 作為莫比烏斯函式的記號。具體定義如下 如果乙個數包含平方因子,那麼miu n 0。例如 miu 4 miu 12 miu 18 0。如果乙個數不包含平方因子,並且有k個不同的質因子,那麼miu n 1...