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