51nod1244 莫比烏斯函式和 杜教篩

2021-08-03 11:03:47 字數 1632 閱讀 6093

求∑n

i=1μ

(i),

n<=

1010

有一篇文必須得轉

author: skywalkert

original article:

last update time : 2017-04-01

推一波式子 (下面的除法都是整除) 由∑

ni=1

∑d|i

μ(d)

=1可推 ∑n

i=1∑

nij=

1μ(j

)(等價

於列舉a

=ij,

給a累加

μ(j)

) 分出i=1的情況, ∑n

i=1μ

(i)+

∑ni=

2∑ni

j=1μ

(j)=

1 也就是 an

s(n)

=∑ni

=1μ(

i)=−

∑ni=

2ans

(ni)

+1其中ni

分塊。下面分析這樣遞迴求解的時間複雜度。 設t

(n) 為求解an

s(n)

的複雜度, t(

n)=n

√(分塊

)+∑n

√i=1

t(i)

+t(n

i)(求

解子問題

) t(

n)=n

√+∑n

√i=1

i√+n

i−−√

(只展開一層,考慮最高次項)

又因為∑n√

i=1i

√+ni

−−√=

o(n3

4),所以總的時間複雜度就是o(

n34)

算過的不需要再算,用map存起來。不用會t比較多點。

還可以進行優化,可以先用線篩預處理出前k個的ans,經推導k取n2

3 時有最小複雜度o(

n23)

。 這樣實際上不僅減少了理論複雜度,更大大縮減了hashmap的定址時間。

核心思想是數學變形+交換主體+利用狄利克雷卷積性質

如果能通過狄利克雷卷積構造乙個更好計算字首和的函式,且用於卷積的另乙個函式也易計算,則可以簡化計算過程。

經試驗,不加map或不預處理都會t!

#include 

#include

#include

#include

#define n 10000001ll

typedef

long

long ll;

using

namespace

std;

ll a,b,mu[n],ini;

map h;

bool is[n];

int p[n];

void init(ll n)

}mu[i]+=mu[i-1];

}}ll solve(ll x)

return k=ret;

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

51nod 1244 莫比烏斯函式之和

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