临沂在线房产网:用杜教筛求解数论函数前缀和
时间:8个月前 阅读:102 评论:1
<杜教筛用来求数论函数>\(f\)〖前缀和〗。复杂度为\(O(n^{\frac{2}{3}})\)
<条件>
【若是我们要求】\(S(n)=\sum\limits_{i=1}^nf(i)\), 那么需要找[到一个数论函数\(g\),知足\(g\)的〖前缀和〗可以异常快速的求出来,『而且』\(g*f\)的〖前缀和〗可以异常快速的求出来。
推导
既然\(g*f\)的〖前缀和〗可以异常快速的求出来,我们就求\(g*f\)的〖前缀和〗。
即\(\sum\limits_{i=1}^n\sum\limits_{d|i}g(\frac{i}{d})f(d)\)。
然后我们想获得的是\(\sum\limits_{i=1}^nf(i)\)。以是我们让上面的式子减去一个\(\sum\limits_{i=1}^n\sum\limits_{d|i,d\neq i}g(\frac{i}{d})f(d)\)。
对于后面这个式子,我们用\(\frac{n}{d}\)《来「取」代》\(d\),就变成了
\[\sum\limits_{i=1}^n\sum\limits_{d\neq 1,d|i}g(d)f(\frac{i}{d}) \] \[=\sum\limits_{d=2}^n g(d)\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor}f(i) \] \[=\sum\limits_{d=2}^n g(d)S(\lfloor\frac{n}{d}\rfloor) \]《「由于」》\(g\)的〖前缀和〗可以快速求出,以是直接数论分块,后面的\(S(\frac{n}{d})\) 直接递归<就好了>[。
这样我们获得的是\(\sum\limits_{i=1}^ng(1)f(i)=g(1)\sum\limits_{i=1}^n f(i)\),<以是谜底除以>\(g(1)\)(一样平常为1)<就好了>。
【例子】
“以求”\(\varphi\)的〖前缀和〗为例。《「由于」》\(f*1=Id\),\(1\)和\(Id\)的〖前缀和〗都异常好求,【以是】我们令\(g\)为\(1\)「即可」。
\[S(n)=\sum\limits_{i=1}^n\sum\limits_{d|i}\varphi(d)-\sum\limits_{i=1}^n\sum\limits_{d|i,d\neq i}\varphi(d)\\ = \sum\limits_{i=1}^ni-\sum\limits_{i=1}^n\sum\limits_{d|i,d\neq 1}\varphi(\frac{n}{d})\\ =\frac{n(n+1)}{2}-\sum\limits_{d=2}^n\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor}\varphi(i)\\ = \frac{n(n+1}{2}-\sum\limits_{d=2}^nS(\lfloor\frac{n}{d}\rfloor) \]再来推一下\(\mu\)的〖前缀和〗。《「由于」》\(\mu * 1= \epsilon\),\(1\)和\(\epsilon\)的〖前缀和〗都异常好求,以是照样令\(g=1\)
\[S(n)=\sum\limits_{i=1}^n\sum\limits_{d|i}\mu(d)-\sum\limits_{i=1}^n\sum\limits_{d|i,d\neq i}\mu(d)\\ =1-\sum\limits_{d=2}^n\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor}\mu(i)\\ = 1-\sum\limits_{d=2}^nS(\lfloor\frac{n}{d}\rfloor) \]关于预处理
这样直接搜的复杂度是\(O(n^{\frac{3}{4}})\),为了使复杂度更优,我们需要先预处理出一部分谜底,「若是我们预处理除了」\([1,K]\)『的谜底』,当盘算\([1,K]\)中的效果“〖【时】〗”,直接返回「即可」。
可以证实当\(K\)「取」\(n^{\frac{2}{3}}\)“〖【时】〗”,<复杂度最优异为>\(n^{\frac{2}{3}}\)
(关)于影象化
{为了让复杂度是准确的},「我们一定要将每次算出的效果影象化下」来。《「由于」》\(n\)比较大,以是需要用\(map\)『来影象化』。这样复杂度就会多个\(log\)
另有一种方式,《「由于」》我们每次递归到的\(x\)一定知足:所有知足\(\frac{n}{y}=\frac{n}{x}\)的\(y\)中,只有\(x\)会被盘算到。以是我们可以用一个数组ma影象化,〖当查询的〗\(n\)小于即是\(K\)“〖【时】〗”,我们直接局限谜底,〖当查询的〗\(n\)大于\(K\)“〖【时】〗”,我们查看\(ma[\lfloor \frac{n}{K}\rfloor]\)中的值「即可」。
当有多次询问“〖【时】〗”,第二种方式需要清空,复杂度可能不如第一种。
代码
“以求”\(\varphi\)的〖前缀和〗为例。
void pre() {
phi[1] = 1;
for(int i = 2;i < N;++i) {
if(!vis[i]) {
prime[++tot] = i;
phi[i] = i - 1;
}
for(int j = 1;j <= tot && prime[j] * i < N;++j) {
vis[prime[j] * i] = 1;
if(i % prime[j]) {
phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
else {
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
}
}
for(int i = 2;i < N;++i) phi[i] = (phi[i] + phi[i - 1]) % mod;
}
ll MAX;
ll PHI(ll n) {
if(n < N) return phi[n];
if(vis[MAX / n]) return maphi[MAX / n];
vis[MAX / n] = 1;
ll ret = (n % mod) * ((n + 1) % mod) % mod * inv % mod;
for(ll l = 2,r;l <= n;l = r + 1) {
r = n / (n / l);
ret -= ((r - l + 1) % mod) * PHI(n / l) % mod;
ret %= mod;
}
return maphi[MAX / n] = ret;
}
,“诚信在线”[ www.nzg8.com自与农展馆合作以来,拓展了业务战线,深化了服务体系,“整合了群体”,在未来的2019{年},将能更好地为 “诚信在线”[娱乐网的会员提供更优质的服务。
网友评论
皇冠足球盘怎么代理
回复www.66rfd.com(www.wyxgs.com)是Sunbet 申博的官方网站。www.66rfd.com提供申博开户(sunbet开户)、SunbetAPP下载、Sunbet代理合作等业务。讲真,很有水准