Min 25 篩 學習筆記

2022-03-31 15:08:24 字數 1857 閱讀 9754

埃氏篩法

整除分塊(這裡有提到)

1. 問題模型

2. min_25 篩

3. 模板題以及模板**

有乙個積性函式 $f$ ,對於所有質數 $p$,$f(p)$ 是關於 $p$ 的多項式,$f(p^k)$ 非常容易計算(不一定是關於 p 的多項式)。

求$$\sum_^ f(i)$$

$n\leq 10^$

$ = 1s$

設集合 $p$ 表示素數集合。

設$$g_ = \sum_ f(i)$$

假設$p\in p$。

$$g(n,m) = \sum_ \rfloor, \forall p'\in p\ and\ p'\leq p ,p'\nmid x}f(x)\right)+\sum_ f(p)$$ 

則$$g(n,m)=\sum_ \rfloor,p)\right)+h(n)-h(m)$$

(以上公式以及下圖摘自 集訓隊**2018 - 朱震霆 - 一些特殊的數論函式求和問題)

接下來我們考慮如何求 $h(x)$ 。

時間複雜度積分算一算就可以知道是 $o(\frac })$。

在求 $g(n,m)$ 的直接爆搜就好了,連記憶化都不用!(但這個我不會證明,為什麼是對的自己看**)

具體**實現主要參見模板部分。

給定 $a,b$, 求

$$\sum_^b \sum_^n \sum_^i [ (i,j) = n]$$

$$a,b\leq 10^$$

$$ = 6s$$

先差分一下,轉化成求字首和。

先把原題的統計無序數對轉化成統計有序數對,最終 $ans' = (ans+n)/2$ 即可。

設集合 $p$ 表示素數集合。

設 $c(n,p)$ 表示最大的使得 $p^|n$ 的數。

若 $ (i,j) = n$ ,則

$$\forall p \in p, c(n,p)=\max(c(i,p),c(j,p))$$

所以,$\forall p\in p$ ,$c(i,p)$ 和 $c(j,p)$ 共有 $2c(n,p) +1 $ 種取值方法。

所以,設

$$n=\prod_i p_i^ (p_i\in p)$$

則$$ \sum_^n \sum_^i [ (i,j) = n] = \prod_t (2k_t+1) $$

顯然這個式子滿足 min_25 篩的條件,直接篩就好了。

關於本題,還有一些其他做法,詳見

#pragma gcc optimize("ofast","inline")

#include #define clr(x) memset(x,0,sizeof (x))

using namespace std;

typedef long long ll;

ll read()

const int base=1000005,n=base*2+5;

ll n,cn,a,b,base;

ll h[n],ps[n],cnt;

ll p[n],pcnt;

#define id(i) ((i)<=base?i:cnt-cn/(i)+1)

ll f(int e)

ll g(ll n,ll m)

return ans;

}ll _solve(ll _n)

for (ll i=1;i<=cnt;i++)

h[i]*=3;

return g(n,1)+1;

}ll solve(ll n)

int main()

Min 25 篩學習筆記

資料和 出處 資料2資料3 打死我也不承認參考了yyb的 min 25 篩可以幹嘛?下文中未特殊說明 p 均指質數集合,p i 或 p 指某個具體質數。求一類積性函式 f x 的字首和,需要滿足 f p 可以寫成多項式的形式,或者操作一下可以寫成多項式 如例題 且 f p k 能快速求出。講真學這個...

Min 25篩 學習筆記

這兒只是乙個簡單說明 概括 總結。原理見這 min 25篩用來求積性函式字首和。範圍一般是 10 要求所求積性函式在 f i 已知時,f p times i p in primes,i times p in 1,n 能快速計算。首先計算 g n,j sum if i quad i是質數 或 i的最小...

Min 25 篩學習筆記

模板 在本文中用 p 表示質數,p i 表示第 i 個質數。題目要我們求的是乙個積性函式的字首和。我們可以對於 n 內的每乙個質因子進行單獨考慮。但是這樣子的複雜度顯然過大,而這很大一部分原因是因為 n 以內的質數。因此如果我們把所有數分成質數和合數考慮,那麼在合數中的不同最小質因子個數就是 fra...