一道杜教筛的板子题。

两个都是积性函数,所以做法是一样的。以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;
}

最新文章

  1. Linux学习笔记(9)-守护进程
  2. spring-listener&amp;spring-task注解版本
  3. log4j.properties 详解与配置步骤
  4. 动态设置 button的 name 的话 闪动的问题 解决
  5. App开发流程之使用分类(Category)和忽略编译警告(Warning)
  6. android 开发赚钱
  7. IOS第18天(10,核心动画-转盘,自定义buton,旋转动画)
  8. 项目管理软件kanboard安装
  9. SecureCRT for Linux突破30天使用限制
  10. 过滤器(filter)实现
  11. python re(正则模块)
  12. ThinkPHP - 自定义标签库 - 标签驱动
  13. delphi程序设计之底层原理(有些深度)
  14. centos7 yum 安装 redis
  15. POJ2187Beauty Contest 旋转卡壳
  16. mvc 三个 之间 肮脏的交易
  17. Java开发笔记(七十四)内存溢出的两种错误
  18. This application failed to start because it could not find or load the Qt platform plugin异常
  19. SQL格式化插件—SQL Pretty Printer
  20. C语言简明数据类型指南

热门文章

  1. ***apache做301重定向的方法
  2. POJ 2337 【字典序】【欧拉回路】
  3. 从 modCount 看 java集合 fail-fast 机制
  4. CDI Services *Decoretions *Intercepters * Scope * EL\(Sp EL) *Eventmodel
  5. activiti eclipse 插件不自动生成png
  6. 重载和重写在jvm运行中的区别(一)
  7. 聚合类新闻client产品功能点详情分析
  8. Jenkins系列之-—05 节点配置
  9. Android 性能优化探究
  10. VMware 虚拟机添加硬盘以及为新添加的硬盘创建Samba共享 (转)