题面:

传送门

就是让你求$ \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));
}
}

[bzoj3944] sum [杜教筛模板]的更多相关文章

  1. [BZOJ3944]Sum(杜教筛)

    3944: Sum Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6201  Solved: 1606[Submit][Status][Discuss ...

  2. 【Bzoj3944】杜教筛模板(狄利克雷卷积搞杜教筛)

    题目链接 哇杜教筛超炫的 有没有见过$O(n^\frac{2}{3})$求欧拉函数前缀和的算法?没有吧?蛤蛤蛤 首先我们来看狄利克雷卷积是什么 首先我们把定义域是整数,陪域是复数的函数叫做数论函数. ...

  3. bzoj3944: Sum 杜教筛板子题

    板子题(卡常) 也可能是用map太慢了 /************************************************************** Problem: 3944 Us ...

  4. BZOJ3944: Sum(杜教筛模板)

    BZOJ3944: Sum(杜教筛模板) 题面描述 传送门 题目分析 求\(\sum_{i=1}^{n}\mu(i)\)和\(\sum_{i=1}^{n}\varphi(i)\) 数据范围线性不可做. ...

  5. 3944: Sum[杜教筛]

    3944: Sum Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3471  Solved: 946[Submit][Status][Discuss] ...

  6. 洛谷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 ...

  7. bzoj 3944 Sum —— 杜教筛

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3944 杜教筛入门题! 看博客:https://www.cnblogs.com/zjp-sha ...

  8. BZOJ 3944: Sum [杜教筛]

    3944: Sum 贴模板 总结见学习笔记(现在还没写23333) #include <iostream> #include <cstdio> #include <cst ...

  9. LG4213 【模板】杜教筛(Sum)和 BZOJ4916 神犇和蒟蒻

    P4213 [模板]杜教筛(Sum) 题目描述 给定一个正整数$N(N\le2^{31}-1)$ 求 $$ans_1=\sum_{i=1}^n\varphi(i)$$ $$ans_2=\sum_{i= ...

随机推荐

  1. C语言字符,字符串,字节操作常用函数

    strlen 这个函数是在 string.h 的头文件中定义的 它的函数原型是 size_t strlen( const char ); size_t 是一个无符号整型,是这样定义的 typedef ...

  2. 1269: [AHOI2006]文本编辑器editor

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5269  Solved: 2037[Submit][Status][Discuss] Descript ...

  3. ARM协处理器

    协处理器是一种芯片,用于减轻系统微处理器的特定处理任务.例如,数学协处理器可以控制数字处理:图形协处理器可以处理视频绘制.例如,intel pentium微处理器就包括内置的数学协处理器.  协处理器 ...

  4. LeetCode955删列造序 ||

    问题:删列造序 || 给定由 N 个小写字母字符串组成的数组 A,其中每个字符串长度相等. 选取一个删除索引序列,对于 A 中的每个字符串,删除对应每个索引处的字符. 比如,有 A = [" ...

  5. PHP代码中出现中文乱码怎么办?

    header("Content-type:text/html;charset=utf-8"); //加上这个就OK //示例 : class WechatController ex ...

  6. js数组删除(splice和delete)

    最近一直在写js的数组,然后就发现了很奇怪的问题,后来才发现了规律. 删除数据的一行,一般有两种方法,一个是splice,一个是delete: splice:删除了数组后,数组的长度会自动变化.用法: ...

  7. day 63 Django基础九之中间件

    Django基础九之中间件   本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学 ...

  8. python3.7 装饰器

    #!/usr/bin/env python __author__ = "lrtao2010" #python3.7 装饰器 #装饰器 ''' 定义:本质就是一个函数,作用是为其他函 ...

  9. python3中文件的读与写

    Python open() 函数用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出错误 完整语法:open(file, mode='r', buf ...

  10. A1002 A+B for Polynomials (25)(25 分)

    1002 A+B for Polynomials (25)(25 分) This time, you are supposed to find A+B where A and B are two po ...