[模板][P3377]杜教筛
Description:
求 $ \sum_{i=1}^n \phi(i) ,\sum_{i=1}^n \mu(i)$
Hint:
\(n<=10^{10}\)
Solution:
考虑积性函数 \(f,g,h\) 及其前缀和 \(F,G,H\)
其中 \(h=f*g\)
首先 \(H(x)=\sum_{n=1}^xh(n)\)
\(=\sum_{n=1}^x \sum_{d|n} f(d) g(\frac{n}{d})\)
枚举倍数转枚举因数
\(=\sum_{k=1}^x \sum_{d=1}^{\lfloor \frac{x}{k} \rfloor} f(d) g(k)\)
$=\sum_{k=1}^x g(k)\sum_{d=1}^{\lfloor \frac{x}{k} \rfloor} f(d) $
\(=\sum_{k=1}^x g(k) F(\lfloor \frac{x}{k} \rfloor)\)
\(=\sum_{k=1}^{x}g(k)F(\lfloor \frac{x}{k} \rfloor)\)
故 \(g(1)F(n)=H(n)-\sum_{d=2}^{n}g(d)F(\lfloor \frac{n}{d} \rfloor)\)
此式是杜教筛的核心式,适用于非线性求一个积性函数的前缀和
只要能快速求出 \(H(n),\sum g(d)\) 就能在$ O(n^{ \frac{2}{3}} ) $ 求出\(F(n)\)
故
\(\sum_{i=1}^n \phi(i)=\frac{n(n+1)}{2}-\sum_{i=2}^n \phi(\lfloor \frac{n}{i} \rfloor)\)
\(\sum_{i=1}^n \mu(i)=1-\sum_{i=2}^n \mu(\lfloor \frac{n}{i}\rfloor)\)
先筛出线性数据范围内的,再杜教筛
递归求解即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int mxn=5e6+5,inf=2147483647;
int T,n,tot;
int p[mxn],vis[mxn];
ll mu[mxn],ph[mxn];
map<int ,ll > smu,sph;
void init()
{
vis[1]=mu[1]=ph[1]=1;
for(int i=2;i<=mxn;++i) {
if(!vis[i]) mu[i]=-1,ph[i]=i-1,p[++tot]=i;
for(int j=1;j<=tot&&p[j]*i<=mxn;++j) {
vis[p[j]*i]=1;
if(i%p[j]) mu[p[j]*i]=-mu[i],ph[p[j]*i]=ph[p[j]]*ph[i];
else {ph[p[j]*i]=ph[i]*p[j];break;}
}
}
for(int i=2;i<=mxn;++i) mu[i]+=mu[i-1],ph[i]+=ph[i-1];
}
ll get_mu(int n)
{
if(n<=mxn) return mu[n];
if(smu[n]) return smu[n]; ll ans=0;
for(int l=2,r;r<inf&&l<=n;l=r+1)
r=n/(n/l),ans+=(r-l+1)*get_mu(n/l);
return smu[n]=1ll-ans;
}
ll get_ph(int n)
{
if(n<=mxn) return ph[n];
if(sph[n]) return sph[n]; ll ans=0;
for(int l=2,r;r<inf&&l<=n;l=r+1) //一定是从2开始
r=n/(n/l),ans+=(r-l+1)*get_ph(n/l);
return sph[n]=(ull)n*(n+1ll)/2-ans;
}
int main()
{
cin>>T; init();
while(T--) {
scanf("%d",&n);
printf("%lld %lld\n",get_ph(n),get_mu(n));
}
return 0;
}
[模板][P3377]杜教筛的更多相关文章
- LG4213 【模板】杜教筛(Sum)和 BZOJ4916 神犇和蒟蒻
P4213 [模板]杜教筛(Sum) 题目描述 给定一个正整数$N(N\le2^{31}-1)$ 求 $$ans_1=\sum_{i=1}^n\varphi(i)$$ $$ans_2=\sum_{i= ...
- Luogu 4213 【模板】杜教筛(Sum)
当作杜教筛的笔记吧. 杜教筛 要求一个积性函数$f(i)$的前缀和,现在这个东西并不是很好算,那么我们考虑让它卷上另外一个积性函数$g(i)$,使$(f * g)$的前缀和变得方便计算,然后再反推出这 ...
- luoguP4213 【模板】杜教筛(Sum)杜教筛
链接 luogu 思路 为了做hdu来学杜教筛. 杜教筛模板题. 卡常数,我加了register居然跑到不到800ms. 太深了. 代码 // luogu-judger-enable-o2 #incl ...
- p4213 【模板】杜教筛(Sum)
传送门 分析 我们知道 $\varphi * 1 = id$ $\mu * 1 = e$ 杜教筛即可 代码 #include<iostream> #include<cstdio> ...
- P4213 【模板】杜教筛(Sum)
\(\color{#0066ff}{题 目 描 述}\) 给定一个正整数\(N(N\le2^{31}-1)\) 求 \(\begin{aligned} ans_1=\sum_{i=1}^n\varph ...
- [洛谷P4213]【模板】杜教筛(Sum)
题目大意:给你$n$,求:$$\sum\limits_{i=1}^n\varphi(i),\sum\limits_{i=1}^n\mu(i)$$最多$10$组数据,$n\leqslant2^{31}- ...
- 【模板】杜教筛(Sum)
传送门 Description 给定一个正整数\(N(N\le2^{31}-1)\) 求 \[ans1=\sum_{i=1}^n \varphi(i)\] \[ans_2=\sum_{i=1}^n \ ...
- P4213【模板】杜教筛(Sum)
思路:杜教筛 提交:\(2\)次 错因:\(\varphi(i)\)的前缀和用\(int\)存的 题解: 对于一类筛积性函数前缀和的问题,杜教筛可以以低于线性的时间复杂度来解决问题. 先要构造\(h= ...
- P4213 【模板】杜教筛(Sum)(杜教筛)
根据狄利克雷卷积的性质,可以在低于线性时间复杂度的情况下,求积性函数前缀和 公式 \[ 求\sum_{i=1}^{n}\mu(i) \] 因为\(\mu*I=\epsilon\) 所以设\(h=\mu ...
随机推荐
- Cookie/Session机制详解(转载)
原文链接:http://blog.csdn.net/fangaoxin/article/details/6952954 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用 ...
- centos下httpd-2.4的编译安装
httpd-2.4编译安装 依赖于更高版本的apr和apr-util apr 全称 apache portable runtime 首先停用低版本的httpd服务 service ...
- Android service与Thread
很多时候,你可能会问,为什么要用 Service,而不用 Thread 呢,因为用 Thread 是很方便的,比起 Service 也方便多了,下面我详细的来解释一下. 1). Thread:Thre ...
- sqlserver循环
普通while循环 1 循环5来修改学生信息 循环遍历修改记录 DECLARE @i int set @i=0 while @i<5 BEGIN update Student set demo ...
- RunLoop的应用场景---关于滑动tableView的时候NSTimer 暂停的问题
1.我们经常会在应用中看到tableView 的header 上是一个横向ScrollView,一般我们使用NSTimer,每隔几秒切换一张图片.可是当我们滑动tableView的时候,顶部的scol ...
- istringstream、ostringstream、stringstream 类介绍 和 stringstream类 clear函数的真正用途
istringstream.ostringstream.stringstream 类介绍 和 stringstream类 clear函数的真正用途 来源: http://blog.csdn.net/T ...
- 两个用于win7任务栏显示进度的dll
Microsoft.WindowsAPICodePack.dll 和Microsoft.WindowsAPICodePack.Shell.dll 下载 参考:http://blog.csdn.net/ ...
- .NetCore源码阅读笔记系列之Security (四) Authentication & AddJwtBearer
接下来我们在来看下AddJwtBearer,这个与AddOpenIdConnect不太一样,后者是远程发起身份认证请求是一种主动发起式的,多用于web等客户端,验证发生在身份认证服务端,而前者是一种被 ...
- jsTree动态加载数据
Views代码 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="view ...
- python实现的椭圆曲线加密
我也看得云里雾里, 但是ECC和RSA并列为非对称加密双雄, 还是很有必要了解一下的. RSA是用质数分解,ECC是用离散的椭圆方程解,安全度更高. 而且,这个ECC的加法乘法规则,和普通都不一样, ...