題面:
傳送門就是讓你求$ \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...