對於積性函式f(x
)f(x)
f(x) 求∑i=
1i≤n
f(i)
(其中n
≤1011
左右)\sum_^ f(i)(其中n\leq 10^左右)
i=1∑i≤
nf(
i)(其
中n≤1
011左
右)必須滿足的條件是:
當p為質數時,f(p
)f(p)
f(p)
必須能表示為乙個多項式的形式,即f(p
)=a0
+a1p
+a2p
2+……
f(p)=a_0+a_1p+a_2p^2+……
f(p)=a
0+a
1p+
a2p
2+……
。並且項數不能太多(因為每一項都要手寫公式求和)
在簡介中已經寫到,對於每一項都要分別求和,因此假設我們現在求的是第k+1項,即f(p
)=ak
pkf(p)=a_kp^k
f(p)=a
kpk
設g (i
,j)=
∑k為質
數,或k
的最小質
pjf(k)
g(i,j)=\sum_f(k)
g(i,j)
=k為質
數,或k
的最小質
pj∑f
(k)那麼,顯然g(i
,0)g(i,0)
g(i,0)
就是所有數的k次方和。
這玩意就得考手推公式了:比如0次方和=i,1次方和=i∗(
i+1)
2\frac 2
2i∗(i+
1)……
然後需要轉移:
首先,要求i≥p
rj∗p
rji\geq pr_j*pr_j
i≥prj
∗prj
(否則g(i
當然,暴力算還是會t的。
但是由於乙個性質:(nab
\frac }
ban
的個數=n
c\frac
cn的個數,即不超過2
n2\sqrt n
2n種)
就可以預處理出可能的ipj
\frac
pji
的值。然後就能快速算了。
然後,設
(當i
ji< pr_jij
時,s (i
,j)=
0s(i,j)=0
s(i,j)
=0,因此,下面預設i≥p
rji\geq pr_j
i≥prj
)顯然,其中的質數部分為:g(i
,∣p∣
)−∑k
=1j−
1f(p
k)g(i,|p|)-\sum_^f(p_k)
g(i,∣p
∣)−∑
k=1j
−1f
(pk
)1、對於一些題目,可能在某些特定位置不滿足條件,此時可以先忽略,最後再特判這些位置。
2、有些函式在多項式中係數不為1,這時最好先忽略係數,最後來乘。
loj6053簡單的函式
#include
#include
#include
#include
#include
#define sf scanf
#define pf printf
#define maxn 200010
#define mod 1000000007
using
namespace std;
typedef
long
long ll;
ll sqr,n;
bool isprime[maxn]
;int primes[maxn]
,tot;
ll sum[maxn]
;void
prepare()
for(
int j=1;
1ll*i*primes[j]
<=sqr;j++)}
}ll w[maxn]
,id1[maxn]
,id2[maxn]
,g[maxn]
,h[maxn]
;int cnt;
void
get_g()
for(
int j=
1;j<=tot;j++
)for
(int i=
1;i<=cnt&&
1ll*primes[j]
*primes[j]
<=w[i]
;i++)}
ints
(ll x,
int j)
}return res;
}int
main()
演算法 Min 25篩
本篇文章中使用的字母 p 指 text p in text 若函式 f x 滿足,f x 是積性函式 f p 可以使用多項式表示。已知 f p 要能在常數級的時間內計算 f p x x in n min 25篩可以在 theta frac 的時間複雜度內計算 f x 的字首和 或者說 theta n...
Min 25 篩學習筆記
資料和 出處 資料2資料3 打死我也不承認參考了yyb的 min 25 篩可以幹嘛?下文中未特殊說明 p 均指質數集合,p i 或 p 指某個具體質數。求一類積性函式 f x 的字首和,需要滿足 f p 可以寫成多項式的形式,或者操作一下可以寫成多項式 如例題 且 f p k 能快速求出。講真學這個...
Min 25 篩 學習筆記
埃氏篩法 整除分塊 這裡有提到 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 ...