bzoj3944 sum 杜教篩模板

2022-03-07 08:07:42 字數 1608 閱讀 2596

題面:

傳送門就是讓你求$ \varphi\left(i\right) $以及$ \mu\left(i\right) $的字首和

思路:

就是杜教篩的模板

我們把套路公式拿出來:

$ g\left(1\right)s\left(n\right)=\sum_^\left(g\ast f\right)\left(i\right)-\sum_^g\left(i\right)s\left(\frac ni\right) $

其中函式$f$分別為$\varphi$以及$\mu$

對於這兩個函式有兩個非常好用的卷積公式:

$\left(\mu\ast i\right)=\varepsilon$

$\left(\varphi\ast i\right)=id$

那麼我們設g(x)=1,然後把g(x)帶進去,兩個字首和就變成了這樣的:

$s\left(n\right)=1-\sum_^s\left(\frac ni\right)$這個是$\mu$

$s\left(n\right)=\frac-\sum_^s\left(\frac ni\right)$這個是$\varphi$

然後遞迴,記憶化求和就可以了

注意最好寫成乙個遞迴處理兩個答案......不然會t成狗

code:

這裡提供兩個函式分開的版本,方便檢視

1 #include2 #include3 #include4 #include5 #include6

#define ll long long

7using

namespace

std;

8inline ll read()

14while(ch>='

0'&&ch<='

9') re=(re<<1)+(re<<3)+ch-'

0',ch=getchar();

15return re*flag;16}

17 ll phi[2000010],pri[2000010],tot=0,mu[2000010],n;bool vis[2000010

];18

void

init()

24for(j=1;j<=tot;j++)

32 phi[k]=phi[i]*phi[pri[j]];

33 mu[k]=-mu[i];34}

35}36for(i=2;i<=2000000;i++) phi[i]=phi[i-1]+phi[i],mu[i]=mu[i-1]+mu[i];37}

38 ll sum1(ll x)

39 ll v1[1000010],v2[1000010],m1[1000010],m2[1000010

];40

ll s1(ll x)

48 v1[t]=1;49

return m1[t]=re;50}

51ll s2(ll x)

59 v2[t]=1;60

return m2[t]=re;61}

62int

main()

68 }

BZOJ P3944 Sum 數論 杜教篩

bzoj傳送門 一共t 1行 第1行為資料組數t t 10 第2 t 1行每行乙個正整數n,代表一組詢問 output 一共t行,每行兩個用空格分隔的數ans1,ans2 sample input 6 1 2 8 13 30 2333 sample output 1 1 2 0 22 2 58 3 ...

習題 杜教篩(Sum)(杜教篩)

傳送門杜教篩的板子,拿來練手 beginans sum phi i end g n 1,phi n f n h n sum phi d g frac n h n sum f d g frac 令f n sum f i h n sum h i beginh n sum h i sum sum f d ...

bzoj4805 尤拉函式求和(杜教篩)

題意 給定n,求尤拉函式前n項和。資料範圍 n 2e9 解法 尤拉函式性質 d n d n sum d n d n d n轉化為卷積形式 i i d i id i id 杜教篩遞推式 g 1 s n i 1n f g i i 2 ng i s ni g 1 s n sum n f g i sum n...