[BZOJ3944]Sum(杜教筛)
3944: Sum
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 6201 Solved: 1606
[Submit][Status][Discuss]Description
Input
一共T+1行第1行为数据组数T(T<=10)第2~T+1行每行一个非负整数N,代表一组询问Output
一共T行,每行两个用空格分隔的数ans1,ans2Sample Input
6
1
2
8
13
30
2333Sample Output
1 1
2 0
22 -2
58 -3
278 -3
1655470 2HINT
Source
最基础的杜教筛。
杜教筛实际上就是这样一个式子:$$F(n)=H(n)-\sum\limits_{i=2}^{n}g(i)F(\lfloor\frac{n}{i}\rfloor)$$
设要求的是$f$的前缀和,辅助函数分别是$g$和$h$,$F$,$G$,$H$分别是三个函数的前缀和,如果能在$O(1)$的时间内求出$G$和$H$,就能在$O(n^{\frac{3}{4}})$内求出$F$。复杂度$O(\sum\limits_{i=1}^{\sqrt{n}} \sqrt{\frac{n}{i}})=O(n^\frac{4}{3})$,通过预处理前$n^{\frac{2}{3}}$个数就可以做到$O(n^{\frac{2}{3}})$了。
对于后面的$F(n)$值数组下标不可能直接记录,但是注意到我们最终需要的$F$函数值最多有$O(n^{\frac{2}{3}})$个(因为$\lfloor \frac{\lfloor\frac{a}{b}\rfloor}{c} \rfloor=\lfloor \frac{a}{bc} \rfloor$),所以对于后面的值可以把$x$存到$n/x$里。
回到这题,不要爆int就好了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
typedef long long ll;
using namespace std; const int N=,M=;
int T,n,m,tot,p[N];
ll phi[N],mu[N],Phi[M],Mu[M];
bool vis[M]; ll getphi(int x){ if (x<=m) return phi[x]; else return Phi[n/x]; }
ll getmu(int x){ if (x<=m) return mu[x]; else return Mu[n/x]; } void solve(int x){
if (x<=m) return;
int t=n/x,lst=; ll p1=,p2=;
if (vis[t]) return;
vis[t]=; Phi[t]=(1ll*x+)*x>>; Mu[t]=;
while (lst<x){
int i=lst+; lst=x/(x/i); solve(x/i);
p1+=getphi(x/i)*(lst-i+); p2+=getmu(x/i)*(lst-i+);
}
Phi[t]-=p1; Mu[t]-=p2;
} int main(){
freopen("bzoj3944.in","r",stdin);
freopen("bzoj3944.out","w",stdout);
scanf("%d",&T); m=; phi[]=mu[]=;
rep(i,,m){
if (!phi[i]) p[++tot]=i,phi[i]=i-,mu[i]=-;
for (int j=; j<=tot && i*p[j]<=m; j++)
if (i%p[j]==) { phi[i*p[j]]=p[j]*phi[i]; mu[i*p[j]]=; break; }
else phi[i*p[j]]=(p[j]-)*phi[i],mu[i*p[j]]=-mu[i];
}
rep(i,,m) phi[i]=phi[i-]+phi[i],mu[i]=mu[i-]+mu[i];
while (T--){
scanf("%d",&n); memset(vis,,sizeof(vis));
if (n<=m) printf("%lld %lld\n",phi[n],mu[n]);
else solve(n),printf("%lld %lld\n",Phi[],Mu[]);
}
return ;
}
[BZOJ3944]Sum(杜教筛)的更多相关文章
- [bzoj3944] sum [杜教筛模板]
题面: 传送门 就是让你求$ \varphi\left(i\right) $以及$ \mu\left(i\right) $的前缀和 思路: 就是杜教筛的模板 我们把套路公式拿出来: $ g\left( ...
- bzoj3944: Sum 杜教筛板子题
板子题(卡常) 也可能是用map太慢了 /************************************************************** Problem: 3944 Us ...
- 3944: Sum[杜教筛]
3944: Sum Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3471 Solved: 946[Submit][Status][Discuss] ...
- 【Bzoj3944】杜教筛模板(狄利克雷卷积搞杜教筛)
题目链接 哇杜教筛超炫的 有没有见过$O(n^\frac{2}{3})$求欧拉函数前缀和的算法?没有吧?蛤蛤蛤 首先我们来看狄利克雷卷积是什么 首先我们把定义域是整数,陪域是复数的函数叫做数论函数. ...
- 洛谷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 ...
- bzoj 3944 Sum —— 杜教筛
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3944 杜教筛入门题! 看博客:https://www.cnblogs.com/zjp-sha ...
- BZOJ 3944: Sum [杜教筛]
3944: Sum 贴模板 总结见学习笔记(现在还没写23333) #include <iostream> #include <cstdio> #include <cst ...
- 【BZOJ3944】Sum(杜教筛)
[BZOJ3944]Sum(杜教筛) 题面 求\[\sum_{i=1}^n\mu(i)和\sum_{i=1}^n\phi(i)\] 范围:\(n<2^{31}\) 令\[S(n)=\sum_{i ...
- BZOJ3944: Sum(杜教筛模板)
BZOJ3944: Sum(杜教筛模板) 题面描述 传送门 题目分析 求\(\sum_{i=1}^{n}\mu(i)\)和\(\sum_{i=1}^{n}\varphi(i)\) 数据范围线性不可做. ...
随机推荐
- Codeforces Round #531 (Div. 3) F. Elongated Matrix(状压DP)
F. Elongated Matrix 题目链接:https://codeforces.com/contest/1102/problem/F 题意: 给出一个n*m的矩阵,现在可以随意交换任意的两行, ...
- POJ2391:Ombrophobic Bovines(最大流+Floyd+二分)
Ombrophobic Bovines Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 21660Accepted: 4658 题目 ...
- 树形DP小结
树形DP1.简介:树是一种数据结构,因为树具有良好的子结构,而恰好DP是从最优子问题更新而来,那么在树上做DP操作就是从树的根节点开始深搜(也就是记忆化搜索),保存每一步的最优结果.tips:树的遍历 ...
- JSR330的注解和spring的原生注解的比较
下面的图比较了JSR330和spring的原生注解.其实在大多数场合下他们之间可以互相代替.有可能spring写注解时参考了JSR330的注解:
- photo@PKU
- elk,centos7,filebeat,elasticsearch-head详细安装步骤
先来张图,大致结构应该晓得,对吧! 安装jdk:至少1.8以上 yum -y localinstall jdk-8u73-linux-x64.rpm 安装elasticsearch5.2.1 用普通用 ...
- MySQL 8.0.11(zip)安装及配置
(1)下载MySQL8.0.11: (2)解压zip文件: 我解压到了D:/MySQL/mysql-8.0.11-winx64 (3)配置环境变量: 右键此电脑->属性 高级系统设置 环境变 ...
- Spring学习-- IOC 容器中 bean 的生命周期
Spring IOC 容器可以管理 bean 的生命周期 , Spring 允许在 bean 声明周期的特定点执行定制的任务. Spring IOC 容器对 bean 的生命周期进行管理的过程: 通过 ...
- bzoj 1942 斜率优化DP
首先我们贪心的考虑,对于某一天来说,我们只有3中策略,第一种为不做任何行动,这时的答案与前一天相同,第二种为将自己的钱全部换成a,b货币,因为如果换a,b货币,代表在之后的某一天卖出去后会赚钱,那么当 ...
- python2.7字典转换成json时中文字符串变成unicode的问题:
参考:http://blog.csdn.net/u014431852/article/details/53058951 编码问题: python2.7字典转换成json时中文字符串变成unicode的 ...