\(csp\)還有不到一個月。
才發現本身不會線性篩,\(mdzz\).
(代碼都沒試過,請謹慎使用)spa
for(int i=2;i<=n;++i) { if(!vis[i]) pri[++cnt]=i; for(int j=1;j<=cnt&&i*pri[j]<=n;++j) { vis[i*pri[j]]=1; if(i%pri[j]==0) break; } }
只會被最小的素數篩掉。
\(n=p_1^{k_1}*p_2^{k_2}……p_x^{k_x}\)
枚舉的\(i\)爲\(\frac{n}{p_1}\)
當\(n\%pri[j]==0\) 就是說枚舉到了\(pri[j]*i\)的最小質因子的邊界了。
再日後的\(pri[j]\)就會比\(i\)裏面的質因子小了,固然不行了。
以前的質因子都是小於\(i\)的質因子,固然行了。
\(n\%pri[j]==0\)就是剛好相等的時候。
能夠很方便的求積性函數,只須要毒瘤的簡單的分類討論就行了。code
\[ \mu(x)=\left\{ \begin{aligned} & 1& n=1 \\ & (-1)^k& n=p_1*p_2…p_k \\ & 0& n=others \end{aligned}\right. \]blog
mu[1]=1; for(int i=2;i<=n;++i) { if(!vis[i]) { pri[++cnt]=i; mu[i]=-1; } for(int j=1;j<=cnt&&i*pri[j]<=n;++j) { vis[i*pri[j]]=1; if(i%pri[j]==0) { mu[i*pri[j]]=0; break; } else mu[i*pri[j]]=-mu[i]; } }
那些
\[ \sum_{d|n}\mu(d)=\left\{ \begin{aligned} & 1& n=1 \\ & 0& n>1 \end{aligned}\right. \]
這個二項式定理啥的證
\(\sum_{i=0}^{k}(-1)^kC_k^i\).圖片
\(\phi(n)\)與\(n\)互質的數的個數
以前寫的懶得敲了。
篩的主要仍是利用\(n*\frac{p_1-1}{p_1}……\frac{p_k-1}{p_k}\)it
phi[1]=1; for(int i=2;i<=n;++i) { if(!vis[i]) { pri[++cnt]=i; phi[i]=i-1; } for(int j=1;j<=cnt&&i*pri[j]<=n;++j) { vis[i*pri[j]]=1; if(i%pri[j]==0) { phi[i*pri[j]]=phi[i]*pri[j]; break; } else phi[i*pri[j]]=phi[i]*(pri[j]-1); } }
\[\sum_{d|n}\phi(d)=n\]
咱不會證,咱也不想一想.class
若是 \(x=p_1^{c_1}p_2^{c_2}...p_k^{c_k}\) ,則 \(d(x)=(1+c_1)(1+c_2)...(1+c_k)\)
篩的過程當中,咱們記錄一個 \(num(x)\) 表示 \(x\) 的最小質因子的個數,即 \(c_1\) 。
而後\(xjb\)轉移im
for(int i=2;i<=n;++i) { if(!vis[i]) { pri[++cnt]=i; num[i]=1; d[i]=2; } for(int j=1;j<=cnt&&i*pri[j]<=n;++j) { vis[i*pri[j]]=1; if(i%pri[j]==0) { num[i*pri[j]]=num[i]+1; d[i*pri[j]]=d[i]/(num[i]+1)*(num[i*pri[j]]+1); break; } else { num[i*pri[j]]=1; d[i*pri[j]]=d[i]*2; } } }
咱們設sd(i)表示i的約數和。
\(sd(n)=(1+p_1+…+p_1^{r_1})*(1+p_2+…+p_2^{r_2})*…*(1+p_k…+p_k^{r_k})\)
等差數列似的一個東西。
這個時候咱們須要記錄最小質因子的那一項也就是\((1+p_x+p_x^2+……+p_x^{r_1})\),叫他\(num(i)\).能夠設sd(i)表示i的約數和。設
(一),當前數是一個素數:
\(sd(i)=i+1\)
\(num(i)=i+1\)
(二),當前數取模枚舉的質數不等於0
\((i*prime[j])\)裏原先沒有\((prime[j])\)這一項,加上這一項以後可得:\(sd(i*prime[j])=sd(i)*sd(prime[j])\)
\(num(i*prime[j])=1+prime[j]\)
(三),當前數取模枚舉的質數等於0
\(sd(i*prime[j])=sd(i)/num(i)*(num(i)*prime[j]+1)\)
\(num(i*prime[j])=num(i)*prime[j]+1\)d3
sd[1]=1; for(int i=2;i<=n;++i) { if(!vis[i]) { pri[++cnt]=i; num[i]=sd[i]=i+1; } for(int j=1;j<=cnt&&i*pri[j]<=n;++j) { vis[i*pri[j]]=1; if(i%pri[j]==0) { sd[i*pri[j]]=sd[i]/num[i]*(num[i]*pri[j]+1); num[i*pri[j]]=num[i]*pri[j]+1; break; } else { sd[i*pri[j]]=sd[i]*sd[pri[j]]; num[i*pri[j]]=pri[j]+1; } } }