3944: Sum[杜教筛]
3944: Sum
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 3471 Solved: 946
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1
2
8
13
30
2333
Sample Output
2 0
22 -2
58 -3
278 -3
1655470 2
HINT
Source
我们考虑令:
\[F_n = \sum_{d|n}\varphi(d)\]
那么,有:
\[\sum_{i=1}^{n}F_i = \sum_{i=1}^{n}\sum_{d|i}\varphi(d) = \sum_{d=1}^{n}\varphi(d)\times \lfloor\frac{n}{d}\rfloor = \sum_{d=1}^{n}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\varphi(i)\]
为什么最后一步可以这么转化呢?我们考虑一个 \(i\) ,论 \(\varphi(i)\) 对答案的贡献:
在最后一个等式的左边,\(\varphi(i)\) 对答案的贡献为:\(\lfloor\frac{n}{i}\rfloor\),这很显然。
在等式的右边,当 \(i\times d \le n\) 的时候,\(\varphi(i)\)才会对答案产生贡献,所以对于每一个 \(d\le\lfloor\frac{n}{i}\rfloor\),\(\varphi(i)\)都会对答案产生贡献,所以在等式右边,\(\varphi(i)\) 对答案的贡献也为:\(\lfloor\frac{n}{i}\rfloor\)。
于是等式是成立的。
不懂的话,移步这里:莫比乌斯反演与杜教筛 笔记。
那么就有:
\[\sum_{i=1}^{n}\varphi(i) = \sum_{i=1}^{n}\sum_{d|i}\varphi(d) - \sum_{d=2}^{n}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\varphi(i)\]
还有:
\[\sum_{i=1}^{n}\sum_{d|i}\varphi(d) = \sum_{i=1}^{n}i = \frac{n\times(n+1)}{2}\]
所以:
\[\sum_{i=1}^{n}\varphi(i) = \frac{n\times(n+1)}{2} - \sum_{d=2}^{n}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\varphi(i)\]
所以算\(\sum_{i=1}^{n}\varphi(i)\)的时候就可以记忆化搜索啦。
据说,我们把 \(N^{\frac{2}{3}}\) 之内的答案先筛出来,然后再进行记忆化搜索,复杂度就是 \(O(N^{\frac{2}{3}})\)的了。
然后同理,有:
\[\sum_{i=1}^{n}\mu(i) = 1 - \sum_{d=2}^{n}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\mu(i)\]
时空复杂度均为 \(O(N^{\frac{2}{3}})\) 。
#include<cstdio>
#include<cstring>
#define clr(s) memset(s,0,sizeof s)
using namespace std;
typedef long long ll;
const int N=1e5+,M=2e6+;
int T,n,m,tot,prime[M/];bool check[M];
ll phi[M],mu[M];
ll alpha[N],beta[N];bool vis[N];
inline void sieve(){
m=M-;mu[]=phi[]=;
for(int i=;i<=m;i++){
if(!check[i]) prime[++tot]=i,mu[i]=-,phi[i]=i-;
for(int j=;j<=tot&&i*prime[j]<=m;j++){
check[i*prime[j]]=;
if(!(i%prime[j])){mu[i*prime[j]]=;phi[i*prime[j]]=phi[i]*prime[j];break;}
mu[i*prime[j]]=-mu[i];phi[i*prime[j]]=phi[i]*(prime[j]-);
}
}
for(int i=;i<=m;i++) mu[i]+=mu[i-],phi[i]+=phi[i-];
}
inline ll GetPhi(int x){
return x<=m?phi[x]:alpha[n/x];
}
inline ll GetMu(int x){
return x<=m?mu[x]:beta[n/x];
}
void solve(int x){
if(x<=m) return ;
int t=n/x;
if(vis[t]) return ;
vis[t]=;
alpha[t]=(ll)x*((ll)x+)>>;
beta[t]=;
for(ll i=,pos;i<=x;i=pos+){//假如 x=2^31-1,那么i会爆int
pos=x/(x/i);
solve(x/i);
alpha[t]-=GetPhi(x/i)*(pos-i+);
beta[t]-=GetMu(x/i)*(pos-i+);
}
}
int main(){
sieve();
for(scanf("%d",&T);T--;clr(vis)){
scanf("%d",&n);
if(n<=m){
printf("%lld %lld\n",phi[n],mu[n]);
}
else{
solve(n);
printf("%lld %lld\n",alpha[],beta[]);
}
}
return ;
}
3944: Sum[杜教筛]的更多相关文章
- bzoj 3944 Sum —— 杜教筛
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3944 杜教筛入门题! 看博客:https://www.cnblogs.com/zjp-sha ...
- BZOJ 3944: Sum [杜教筛]
3944: Sum 贴模板 总结见学习笔记(现在还没写23333) #include <iostream> #include <cstdio> #include <cst ...
- [BZOJ3944]Sum(杜教筛)
3944: Sum Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6201 Solved: 1606[Submit][Status][Discuss ...
- 洛谷P4213 Sum(杜教筛)
题目描述 给定一个正整数N(N\le2^{31}-1)N(N≤231−1) 求ans_1=\sum_{i=1}^n\phi(i),ans_2=\sum_{i=1}^n \mu(i)ans1=∑i=1 ...
- [bzoj3944] sum [杜教筛模板]
题面: 传送门 就是让你求$ \varphi\left(i\right) $以及$ \mu\left(i\right) $的前缀和 思路: 就是杜教筛的模板 我们把套路公式拿出来: $ g\left( ...
- bzoj3944: Sum 杜教筛板子题
板子题(卡常) 也可能是用map太慢了 /************************************************************** Problem: 3944 Us ...
- ●杜教筛入门(BZOJ 3944 Sum)
入门杜教筛啦. http://blog.csdn.net/skywalkert/article/details/50500009(好文!) 可以在$O(N^{\frac{2}{3}})或O(N^{\f ...
- bzoj 3944: Sum(杜教筛)
3944: Sum Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4930 Solved: 1313[Submit][Status][Discuss ...
- bzoj 3944: Sum【莫比乌斯函数+欧拉函数+杜教筛】
一道杜教筛的板子题. 两个都是积性函数,所以做法是一样的.以mu为例,设\( f(n)=\sum_{d|n}\mu(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1} ...
随机推荐
- 大数据学习笔记01-HDFS-集群安装
安装 下载 Hadoop,以2.7.5版本为例 在虚拟机上创建目录bigdata,即执行mkdir bigdata 上传到master机器节点的目录~/bigdata下(可以用FileZilla等ft ...
- hql date比较
补充:相等时用to_char,比较大小(<或>)时用 时间格式(如果不是时间格式可以用to_date) java.util.Date date=new java.util.Date(); ...
- Single Pattern(单例模式)
单例模式是一种常用的软件设计模式.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在系统中某个类的实例只能存在一个,单例模式是最好的 ...
- 《HTTP权威指南》学习笔记——URL和资源
URL与资源 URL是互联网资源的标准化名称 1.浏览互联网资源 URL是浏览器寻找信息时所需的资源位置 URI是一类更通用的资源标识符,URL是它的子集. URI的两个子集:URL和URN URL提 ...
- JS貪食蛇網頁代碼
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <bo ...
- phpcms 字符截取str_cut的使用
PHPCMS中截取字符串用的是 str_cut 系统函数,通常在输出标题或者是内容摘要的时候使用来限制字符串的字符,这样就可以防止因字符串而变成的页面变形等问题. 我们来看一下这个函数,在PHPCMS ...
- pycharm 对代码做静态检查
对于下面这种情况,java c这些提前编译的语言,不给你运行机会就立马报错了,但对于动态语言运行之后才能报错,用运行的方法来检查代码错误是在是太坑了,这是py对比静态语言的巨大劣势,尤其是代码文件多行 ...
- AWS系列-创建 IAM 用户
创建 IAM 用户(控制台) 官方文档 https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/introduction.html 通过 AWS ...
- php中实现记住密码下次自动登录的例子
这篇文章主要介绍了php中实现记住密码下次自动登录的例子,本文使用cookie实现记住密码和自动登录功能,需要的朋友可以参考下 做网站的时候经常会碰到要实现记住密码,下次自动登录,一周内免登陆,一个月 ...
- PHP导出excel文件的几种方式
PHP导出excel文件的几种方式 先说说动态生成的内容当作文件来下载的方法: 1.通过把Content-Type设置为application/octet-stream,可以把动态生成的内容当作文件来 ...