题面:

传送门

就是让你求$ \varphi\left(i\right) $以及$ \mu\left(i\right) $的前缀和

思路:

就是杜教筛的模板

我们把套路公式拿出来:

$ g\left(1\right)S\left(n\right)=\sum_{i=1}^{n}\left(g\ast f\right)\left(i\right)-\sum_{i=2}^{n}g\left(i\right)S\left(\frac ni\right) $

其中函数$f$分别为$\varphi$以及$\mu$

对于这两个函数有两个非常好用的卷积公式:

$\left(\mu\ast I\right)=\varepsilon$

$\left(\varphi\ast I\right)=id$

那么我们设g(x)=1,然后把g(x)带进去,两个前缀和就变成了这样的:

$S\left(n\right)=1-\sum_{i=2}^{n}S\left(\frac ni\right)$这个是$\mu$

$S\left(n\right)=\frac{n\ast\left(n+1\right)}{2}-\sum_{i=2}^{n}S\left(\frac ni\right)$这个是$\varphi$

然后递归,记忆化求和就可以了

注意最好写成一个递归处理两个答案......不然会T成狗

Code:

这里提供两个函数分开的版本,方便查看

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define ll long long
using namespace std;
inline ll read(){
ll re=,flag=;char ch=getchar();
while(ch>''||ch<''){
if(ch=='-') flag=-;
ch=getchar();
}
while(ch>=''&&ch<='') re=(re<<)+(re<<)+ch-'',ch=getchar();
return re*flag;
}
ll phi[],pri[],tot=,mu[],n;bool vis[];
void init(){
ll i,j,k;phi[]=mu[]=;phi[]=;
for(i=;i<=;i++){
if(!vis[i]){
pri[++tot]=i;phi[i]=i-;mu[i]=-;
}
for(j=;j<=tot;j++){
k=i*pri[j];if(k>) break;
vis[k]=;
if(i%pri[j]==){
phi[k]=phi[i]*pri[j];
mu[k]=;
break;
}
phi[k]=phi[i]*phi[pri[j]];
mu[k]=-mu[i];
}
}
for(i=;i<=;i++) phi[i]=phi[i-]+phi[i],mu[i]=mu[i-]+mu[i];
}
ll sum1(ll x){return x*(x+)/;}
ll v1[],v2[],m1[],m2[];
ll S1(ll x){
if(x<=) return phi[x];
ll re=sum1(x);ll i,j,t=n/x;
if(v1[t]) return m1[t];
for(i=;i<=x;i=j+){
j=x/(x/i);
re-=(j-i+)*S1(x/i);
}
v1[t]=;
return m1[t]=re;
}
ll S2(ll x){
if(x<=) return mu[x];
ll re=,i,j,t=n/x;
if(v2[t]) return m2[t];
for(i=;i<=x;i=j+){
j=x/(x/i);
re-=(j-i+)*S2(x/i);
}
v2[t]=;
return m2[t]=re;
}
int main(){
ll T=read();init();
while(T--){
n=read();memset(v1,,sizeof(v1));memset(v2,,sizeof(v2));
printf("%lld %lld\n",S1(n),S2(n));
}
}

最新文章

  1. Nginx代理功能与负载均衡详解
  2. sql查询删除重复数据
  3. 自已实现的async 只实现了一部分功能
  4. webstorm调试Node的时候配置
  5. 如何在Dreamweaver中使用emmet
  6. JS 获取和监听屏幕方向变化(portrait / landscape)
  7. android:clipToPadding 和 android:clipChildren 解决ListView设置padding后 padding不跟随改动
  8. C:数组
  9. 数据校验validator 与 DWZ
  10. 为 Web 设计师准备的 25+ 款扁平 UI 工具包
  11. [BZOJ 1692] [Usaco2007 Dec] 队列变换 【后缀数组 + 贪心】
  12. Spring HTTP invoker 入门
  13. 基于visual Studio2013解决C语言竞赛题之1034数组赋值
  14. Delphi的组件读写机制
  15. Django学习(四)---Admin配置
  16. 【编程技巧】NSTimer类的使用
  17. Day4 《机器学习》第四章学习笔记
  18. SpringBoot究竟是如何跑起来的?
  19. C#调用java方法踩坑记
  20. matlab从曲线图提取数据

热门文章

  1. 生成.m文件的python代码中出现的错误
  2. python剑指offer剪绳子
  3. 19课 Vue第二节
  4. shiro学习记录(二)
  5. C# 理解FileInfo类的Open()方法
  6. 操作系统(5)_内存管理_李善平ppt
  7. c++ bitset 10进制转二进制
  8. 【点分树】codechef Yet Another Tree Problem
  9. awk截取指定字段
  10. DeepFaceLab报错,OOM如何解决?