题意

求\(\sum_{i=1}^{n}\varphi(i)和\sum_{i=1}^{n}\mu(i)\)

\(n <= 2^{31}-1\)

不会做啊。。。

只会线性筛,显然不能线性筛

这个时候就需要杜教筛

怎么筛

先看一下狄利克雷卷积

假设我们要求\(F(i)=\sum_{i=1}^{n}f(n)\)而\(n(10^{11}左右)\)比较大不能线性筛时考虑杜教筛

套路的推导:

先随意找一个函数\(g(i)\)和\(f(i)\)求狄利克雷卷积:

$$(g * f)(n) = \sum_{d|n} g(d)f(\frac{n}{d})$$

它的前缀和就是

$$\sum_{i=1}^{n}\sum_{d|i} g(d)f(\frac{i}{d})$$

现在要想办法向\(F(n)\)上靠:

$$原式=\sum_{d=1}{n}\sum_{d|i}g(d)f(\frac{i}{d})=\sum_{d=1}{n}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}g(d)f(i)$$

$$=\sum_{d=1}{n}g(d)\sum_{i=1}{\lfloor\frac{n}{d}\rfloor}f(i)=\sum_{d=1}^{n}g(d)F(\lfloor\frac{n}{d}\rfloor)$$

所以

\[g(1)F(n)=(g * f)(n)-\sum_{d=2}^{n}g(d)F(\lfloor\frac{n}{d}\rfloor)
\]

\(g(1)=1时最好\)

如果能够快速的对\(g\)和\(g * f\)求和,那么就能在\(O(n^{\frac{3}{4}})的时间内计算出F(n)\)复杂度证明略不会

如果\(f\)为积性函数,还可以线性筛出\(F\)的前若干项(\(n^{\frac{2}{3}}\)最优)降低复杂度

Sol

再看这道题

先看\(\varphi\):

设\(\phi(i)=\sum_{i=1}^{n}\varphi(i)\)

按上面的来

$$g(1)\phi(n)=\sum_{i=1}{n}(g*\varphi)(i)-\sum_{i=2}{n}g(d)\phi(\lfloor\frac{n}{d}\rfloor)$$

有个定理\(\sum_{d|n}\varphi(d)=n\)

设\(g(i)=1\)所以

$$\sum_{i=1}{n}(g*\varphi)(i)=\sum_{i=1}{n}\sum_{d|i}\varphi(\frac{i}{d})=\frac{n*(n + 1)}{2}$$

线性筛一部分,带进去递归处理即可

再看\(\mu\):

设\(U(n)=\sum_{i=1}^{n}\mu(i)\)

一样的套路得到

$$g(1)U(n)=\sum_{i=1}{n}\sum_{d|i}g(d)\mu(\frac{i}{d})-\sum_{i=2}{n}g(d)U(\lfloor\frac{n}{d}\rfloor)$$

注意到\(\sum_{d|n}\mu(d)=[n=1]\),直接令\(g(i)=1\)则

$$U(n)=1-\sum_{i=2}^{n}g(d)U(\lfloor\frac{n}{d}\rfloor)$$

一样的递归处理即可

一定要记忆化(我用的map)

# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
const int _(5e6 + 1); IL ll Read(){
RG ll x = 0, z = 1; RG char c = getchar();
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * z;
} int prime[_], num;
ll phi[_], mu[_];
map <int, ll> Phi, Mu;
bool isprime[_]; IL void Prepare(){
isprime[1] = 1; phi[1] = mu[1] = 1;
for(RG int i = 2; i < _; ++i){
if(!isprime[i]){ prime[++num] = i; mu[i] = -1; phi[i] = i - 1; }
for(RG int j = 1; j <= num && i * prime[j] < _; ++j){
isprime[i * prime[j]] = 1;
if(i % prime[j]){ mu[i * prime[j]] = -mu[i]; phi[i * prime[j]] = phi[i] * (prime[j] - 1); }
else{ mu[i * prime[j]] = 0; phi[i * prime[j]] = phi[i] * prime[j]; break; }
}
}
for(RG int i = 2; i < _; ++i) mu[i] += mu[i - 1], phi[i] += phi[i - 1];
} IL ll Sumphi(RG ll n){
if(n < _) return phi[n];
if(Phi[n]) return Phi[n];
RG ll ans = n * (n + 1) / 2;
for(RG ll i = 2, j; i <= n; i = j + 1){
j = n / (n / i);
ans -= (j - i + 1) * Sumphi(n / i);
}
return Phi[n] = ans;
} IL ll Summu(RG ll n){
if(n < _) return mu[n];
if(Mu[n]) return Mu[n];
RG ll ans = 1;
for(RG ll i = 2, j; i <= n; i = j + 1){
j = n / (n / i);
ans -= (j - i + 1) * Summu(n / i);
}
return Mu[n] = ans;
} int main(RG int argc, RG char* argv[]){
Prepare();
for(RG int T = Read(); T; --T){
RG ll n = Read();
printf("%lld %lld\n", Sumphi(n), Summu(n));
}
return 0;
}

杜教筛:Bzoj3944: sum的更多相关文章

  1. 杜教筛 && bzoj3944 Sum

    Description Input 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N,代表一组询问 Output 一共T行,每行两个用空格分隔的数ans1,ans ...

  2. LG4213 【模板】杜教筛(Sum)和 BZOJ4916 神犇和蒟蒻

    P4213 [模板]杜教筛(Sum) 题目描述 给定一个正整数$N(N\le2^{31}-1)$ 求 $$ans_1=\sum_{i=1}^n\varphi(i)$$ $$ans_2=\sum_{i= ...

  3. [洛谷P4213]【模板】杜教筛(Sum)

    题目大意:给你$n$,求:$$\sum\limits_{i=1}^n\varphi(i),\sum\limits_{i=1}^n\mu(i)$$最多$10$组数据,$n\leqslant2^{31}- ...

  4. Luogu 4213 【模板】杜教筛(Sum)

    当作杜教筛的笔记吧. 杜教筛 要求一个积性函数$f(i)$的前缀和,现在这个东西并不是很好算,那么我们考虑让它卷上另外一个积性函数$g(i)$,使$(f * g)$的前缀和变得方便计算,然后再反推出这 ...

  5. P4213 【模板】杜教筛(Sum)

    \(\color{#0066ff}{题 目 描 述}\) 给定一个正整数\(N(N\le2^{31}-1)\) 求 \(\begin{aligned} ans_1=\sum_{i=1}^n\varph ...

  6. luoguP4213 【模板】杜教筛(Sum)杜教筛

    链接 luogu 思路 为了做hdu来学杜教筛. 杜教筛模板题. 卡常数,我加了register居然跑到不到800ms. 太深了. 代码 // luogu-judger-enable-o2 #incl ...

  7. 【模板】杜教筛(Sum)

    传送门 Description 给定一个正整数\(N(N\le2^{31}-1)\) 求 \[ans1=\sum_{i=1}^n \varphi(i)\] \[ans_2=\sum_{i=1}^n \ ...

  8. P4213【模板】杜教筛(Sum)

    思路:杜教筛 提交:\(2\)次 错因:\(\varphi(i)\)的前缀和用\(int\)存的 题解: 对于一类筛积性函数前缀和的问题,杜教筛可以以低于线性的时间复杂度来解决问题. 先要构造\(h= ...

  9. LG4213 【【模板】杜教筛(Sum)】

    sum\(\mu\)求法 设 \[S(n)=\sum_{i=1}^n \mu(i)\] 回顾公式 \[\sum_{d|n}\mu(d)=[n=1]\] 对\(n\)求和 \[\sum_{i=1}^n\ ...

  10. P4213 【模板】杜教筛(Sum)(杜教筛)

    根据狄利克雷卷积的性质,可以在低于线性时间复杂度的情况下,求积性函数前缀和 公式 \[ 求\sum_{i=1}^{n}\mu(i) \] 因为\(\mu*I=\epsilon\) 所以设\(h=\mu ...

随机推荐

  1. UITableView 的使用小点

    1.系统默认的颜色设置//无色 cell.selectionStyle = UITableViewCellSelectionStyleNone; //蓝色 cell.selectionStyle = ...

  2. Android app性能测试小结(7个性能指标)

    1.性能测试的几个指标:       2.性能测试环境准备: 3.启动时间 3.1,监控值的获取方法 启动分为冷启动和热启动,冷启动:应用程序首次启动,进程首次创建并加载资源的过程:热启动:应用程序启 ...

  3. 在项目中遇到关于 CSS Overflow Hidden在iPhone & Safari不起作用

    调试了半天 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <m ...

  4. Shell 编程入门

    首先创建一个文件: 在终端中输入如下命令: vi helloworld.sh 然后按i进行命令编写 下面这句话是必须写的 #!/bin/sh这句话是必须写的 #!/bin/sh a="hel ...

  5. nyoj358 取石子(五) 斐波那契博弈

    我写代码找的规律:如果这个n是斐波那契数,那么它是P态,如2,3,5,8..... 找规律的代码: #include <cstdio> #include <cmath> #in ...

  6. 转: JavaScript 获取对象属性和方法

    一.获取对象属性和方法 Object.keys()for in 返回对象的可枚举属性和方法的名称数组. Object.getOwnPropertyNames() 返回的数组的所有属性(可枚举或不可枚举 ...

  7. 我的Java设计模式-原型模式

    "不好意思,我是卧底!哇哈哈哈~"额......自从写了上一篇的观察者模式,就一直沉浸在这个角色当中,无法自拨.昨晚在看<使徒行者2>,有一集说到啊炮仗哥印钞票,我去, ...

  8. 关系网络理论︱细讲中介中心性(Betweeness Centrality)

    关系网络在我认为都是一种很简单暴力地能挖掘人群特征关系的一种方式,特别今天去听了一场关于AI与金融领域的结合,里面提到了拓扑分析其实就是关系网络的解释.我在之前的文章( R语言︱SNA-社会关系网络- ...

  9. HI3531编译helloworld,执行错误

    若在嵌入式系统中执行某文件出现如下错误: -/bin/sh: XXX: not found 一般是因为缺少库文件,解决方法有2: 1,文件系统的busybox编译时使用动态编译方式 2,或编译该文件的 ...

  10. 《实战Nginx》读书笔记--Nginx配置文件

    先看下一份的Nginx 的配置 #user nobody nobody;#使用的用户和组 worker_processes 4;#工作进程的个数,一般等于CPU核数或者总核数的两倍 #error_lo ...