杜教篩學習筆記

2022-06-26 20:21:15 字數 1275 閱讀 7222

關於一些前置芝士可以看我上乙個部落格【數學筆記】

我們構造\(f,g\)為積性函式,令\(s(n) = \sum\limits_^n f(i)\)

\(\sum\limits_^(f * g)(i) = \sum\limits_^n\sum\limits_(f(d) * g(n/d)) = \sum\limits_ ^ ng(i) * \sum\limits_ ^ f(j) = \sum\limits_ ^ n g(i) * s(n / i)\)

移項整理

\(g(1) * s(n) = \sum\limits_^n(f * g)(i) - \sum\limits_^ng(i) * s(n/i)\)

然後杜教篩的形式就出來了

\(s(n) = \frac^n(f * g)(i) - \sum\limits_^ng(i) * s(n/i)}\)

利用\(\mu * i = \mu(i)\)和\(\varphi * i = id(n)\)把\(g = i\)

那麼我們可以求出關於\(\mu\ \varphi\)的杜教篩公式

\(s(n) = 1 - \sum\limits_ ^ ns(n / i)\)

\(s(n) = \frac - \sum\limits_^ns(n / i)\)

直接寫**的話\(o(n ^ })\)

可以考慮線篩篩出前面的一些值,\(當線篩到n ^ }\)時,杜教篩的複雜度是\(o(n ^ })\)

**

#include #include #define n 7000001

#define ll long long

using namespace std;

int t;

ll n,p[n],mo[n],phi[n];//phi:尤拉函式,mo:莫比烏斯函式

mapf1,f2;

bool used[n];

ll g(ll x)

void euler()

mo[i*p[j]]=-mo[i];

phi[i*p[j]]=phi[i]*(p[j]-1);}}

for(int i=1;i}void ask(ll x,ll &ans1,ll &ans2)

if(f1[x]!=0)

ans1=g(x),ans2=1;//初始值

for(ll i=2,j;i<=x;i=j+1)

f1[x]=ans1;

f2[x]=ans2;

return ;

}int main()

return 0;

}

學習筆記 杜教篩

這是一種通過建構函式 g x 來求一類積性函式字首和的做法,方法比較精妙 考慮我們要求函式 f 的字首和 s n sum n f i 已經有構造好的積性函式 g 將 f,g 做狄利克雷卷積,此時推式子可以得到 sum n f g k sum n sum f d g frac sum n g d su...

學習筆記 杜教篩

入門好部落格 杜教篩 pengym 求一些方便構造卷積形式的積性函式的字首和 不是積性函式如果可以變成卷積形式也可以做 構造h f g,然後推h的字首和,就可以把f字首和遞迴處理 所以,h,g字首和必須可以快速求 有時候,杜教篩的思想也值得借鑑。也是一些題目的解決方法。由於可以記憶化,所以在多次詢問...

學習筆記 杜教篩

dirichlet 卷積,數論分塊 杜教篩用於解決數論函式 f n 的字首和問題,即求 s n sum f i 對於任意數論函式 g n 都有 sum sum f d g left frac right sum g i s left left lfloor frac right rfloor rig...