bzoj 3944: Sum【莫比乌斯函数+欧拉函数+杜教筛】
2024-09-08 05:39:13
一道杜教筛的板子题。
两个都是积性函数,所以做法是一样的。以mu为例,设\( f(n)=\sum_{d|n}\mu(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1}^{n}\mu(i) \),然后很显然对于mu\( g(n)=1\),对于phi\( g(n)=n*(n+1)/2 \),然后可以这样转化一下:
\[g(n)=\sum_{i=1}^{n}\sum_{d|n}\mu(d)
\]
\]
\[=\sum_{d=1}^{n}\mu(d)\left \lfloor \frac{n}{d} \right \rfloor
\]
\]
\[=\sum_{d=1}^{n}s(\left \lfloor \frac{n}{d} \right \rfloor)
\]
\]
\[s(n)=g(n)-\sum_{d=2}^{n}s(\left \lfloor \frac{n}{d} \right \rfloor)
\]
\]
然后递归求解子问题即可。
时间复杂度据说是预处理三分之二的部分加上记忆化可以到\( O(n^{\frac{2}{3}}) \)。当然我并不会算……
p.s 因为是分块来做,所以没必要用map来记忆化。因为预处理了三分之二的部分,所以需要递归计算的x一定大于\( n^{\frac{2}{3}} \),这意味着\( \frac{n}{x} \)的数组取值在可接受的范围之内,事实上,这个数组往往非常小,并且因为分块,所以同一个下标上存的是同一个块的答案,不会冲突。(然而我跑的和map一样慢是怎么回事……
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=5000005,m=5000000;
int T,n,tot,q[N];
long long phi[N],mb[N],hphi[5005],hmb[5005];
bool v[N],vmb[5005],vphi[5005];
long long wkmb(long long x)
{
if(x<=m)
return mb[x];
if(vmb[n/x])
return hmb[n/x];
vmb[n/x]=1;
long long re=1ll;
for(long long i=2,la;i<=x;i=la+1)
{
la=x/(x/i);
re-=(long long)(la-i+1)*wkmb(x/i);
}
return hmb[n/x]=re;
}
long long wkphi(long long x)
{
if(x<=m)
return phi[x];
if(vphi[n/x])
return hphi[n/x];
vphi[n/x]=1;
long long re=(long long)x*(x+1)/2;
for(long long i=2,la;i<=x;i=la+1)
{
la=x/(x/i);
re-=(long long)(la-i+1)*wkphi(x/i);
}
return hphi[n/x]=re;
}
int main()
{
phi[1]=mb[1]=1;
for(int i=2;i<=m;i++)
{
if(!v[i])
{
q[++tot]=i;
mb[i]=-1;
phi[i]=i-1;
}
for(int j=1;j<=tot&&i*q[j]<=m;j++)
{
long long k=i*q[j];
v[k]=1;
if(i%q[j]==0)
{
mb[k]=0;
phi[k]=phi[i]*q[j];
break;
}
mb[k]=-mb[i];
phi[k]=phi[i]*(q[j]-1);
}
}
for(int i=1;i<=m;i++)
{
phi[i]+=phi[i-1];
mb[i]+=mb[i-1];
}
scanf("%lld",&T);
while(T--)
{
memset(vmb,0,sizeof(vmb));
memset(vphi,0,sizeof(vphi));
scanf("%lld",&n);
printf("%lld %lld\n",wkphi(n),wkmb(n));
}
return 0;
}
最新文章
- Linux学习笔记(9)-守护进程
- spring-listener&;spring-task注解版本
- log4j.properties 详解与配置步骤
- 动态设置 button的 name 的话 闪动的问题 解决
- App开发流程之使用分类(Category)和忽略编译警告(Warning)
- android 开发赚钱
- IOS第18天(10,核心动画-转盘,自定义buton,旋转动画)
- 项目管理软件kanboard安装
- SecureCRT for Linux突破30天使用限制
- 过滤器(filter)实现
- python re(正则模块)
- ThinkPHP - 自定义标签库 - 标签驱动
- delphi程序设计之底层原理(有些深度)
- centos7 yum 安装 redis
- POJ2187Beauty Contest 旋转卡壳
- mvc 三个 之间 肮脏的交易
- Java开发笔记(七十四)内存溢出的两种错误
- This application failed to start because it could not find or load the Qt platform plugin异常
- SQL格式化插件—SQL Pretty Printer
- C语言简明数据类型指南
热门文章
- ***apache做301重定向的方法
- POJ 2337 【字典序】【欧拉回路】
- 从 modCount 看 java集合 fail-fast 机制
- CDI Services *Decoretions *Intercepters * Scope * EL\(Sp EL) *Eventmodel
- activiti eclipse 插件不自动生成png
- 重载和重写在jvm运行中的区别(一)
- 聚合类新闻client产品功能点详情分析
- Jenkins系列之-—05 节点配置
- Android 性能优化探究
- VMware 虚拟机添加硬盘以及为新添加的硬盘创建Samba共享 (转)