杜教筛 && bzoj3944 Sum
Description
Input
Output
Sample Input
1
2
8
13
30
2333
Sample Output
1 1
2 0
22 -2
58 -3
278 -3
1655470 2
正解:线性筛+杜教筛。
杜教筛板子题。然而感觉自己还不是很理解的样子。。
唐老师博客:http://blog.csdn.net/skywalkert/article/details/50500009
xLightGod博客:http://blog.xlightgod.com/dirichlet%E5%8D%B7%E7%A7%AF%E4%B8%8E%E6%9D%9C%E6%95%99%E7%AD%9B/
杜教筛可以在低于线性复杂度的时间内求出一些积性函数的前缀和。
为了更快地求$F(i)=\sum_{i=1}^{n}f(i)$,我们构造一个函数$g(n)$,求出$(f*g)(n)$的前缀和。
$\sum_{i=1}^{n}(f*g)(i)=\sum_{i=1}^{n}\sum_{d|i}f(d)g(\frac{i}{d})=\sum_{ij<=n}f(i)g(j)=\sum_{i=1}^{n}g(i)F(\left \lfloor \frac{n}{i} \right \rfloor)$
所以$g(1)F(n)=\sum_{i=1}^{n}(f*g)(i)-\sum_{i=2}^{n}g(i)F(\left \lfloor \frac{n}{i} \right \rfloor)$
于是我们的目标就是快速求出$\sum_{i=1}^{n}(f*g)(i)$和$g(i)$的前缀和。这样我们的复杂度就是$O(n^{\frac{3}{4}})$,如果我们将$O(n^{\frac{2}{3}})$以内的$F(i)$预处理,那么复杂度就可以降到$O(n^{\frac{2}{3}})$(复杂度怎么证。。)
$g$一般取恒等函数$I$。
所以求$\sum_{i=1}^{n}\mu(i)$,那就是求$\sum_{i=1}^{n}\sum_{d|i}\mu(d)-\sum_{i=2}^{n}F(\left \lfloor \frac{n}{i} \right \rfloor)$
则$Ans=1-\sum_{i=2}^{n}F(\left \lfloor \frac{n}{i} \right \rfloor)$
求$\sum_{i=1}^{n}\phi(i)$,那就是求$\sum_{i=1}^{n}\sum_{d|i}\phi(d)-\sum_{i=2}^{n}F(\left \lfloor \frac{n}{i} \right \rfloor)$
则$Ans=\frac{n(n+1)}{2}-\sum_{i=2}^{n}F(\left \lfloor \frac{n}{i} \right \rfloor)$
于是$Ans$的后面那一坨我们用记忆化搜索,空间开不了??我是用的map。开始先把2500000以内的答案线性筛预处理出来,然后搜索即可。(为什么是2500000,因为我发现这样快一些。。复杂度太玄学了。。)
//It is made by wfj_2048~
#include <algorithm>
#include <iostream>
#include <complex>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define inf (1<<30)
#define N (2500010)
#define il inline
#define RG register
#define ll long long
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) using namespace std; struct node{ ll phi,mu; }ans; map <ll,ll> Phi,Mu;
ll vis[N],phi[N],mu[N],prime[N],n,cnt; il ll gi(){
RG ll x=,q=; RG char ch=getchar(); while ((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar(); while (ch>='' && ch<='') x=x*+ch-,ch=getchar(); return q*x;
} il void sieve(){
vis[]=phi[]=mu[]=;
for (RG ll i=;i<N;++i){
if (!vis[i]) phi[i]=i-,mu[i]=-,prime[++cnt]=i;
for (RG ll j=,k=i*prime[j];j<=cnt && k<N;++j,k=i*prime[j]){
vis[k]=;
if (i%prime[j]) phi[k]=phi[i]*phi[prime[j]],mu[k]=-mu[i];
else{ phi[k]=phi[i]*prime[j]; break; }
}
}
for (RG ll i=;i<N;++i) phi[i]+=phi[i-],mu[i]+=mu[i-]; return;
} il node du(RG ll n){
if (n<N) return (node){phi[n],mu[n]};
if (Phi[n]) return (node){Phi[n],Mu[n]};
RG ll ans1=n*(n+)>>,ans2=,pos=; RG node res;
for (RG ll i=;i<=n;i=pos+){
pos=n/(n/i),res=du(n/i);
ans1-=(pos-i+)*res.phi;
ans2-=(pos-i+)*res.mu;
}
Phi[n]=ans1,Mu[n]=ans2;
return (node){ans1,ans2};
} il void work(){
n=gi(); ans=du(n);
printf("%lld %lld\n",ans.phi,ans.mu);
return;
} int main(){
File("du");
sieve(); RG ll T=gi();
while (T--) work();
return ;
}
杜教筛 && bzoj3944 Sum的更多相关文章
- LG4213 【模板】杜教筛(Sum)和 BZOJ4916 神犇和蒟蒻
P4213 [模板]杜教筛(Sum) 题目描述 给定一个正整数$N(N\le2^{31}-1)$ 求 $$ans_1=\sum_{i=1}^n\varphi(i)$$ $$ans_2=\sum_{i= ...
- [洛谷P4213]【模板】杜教筛(Sum)
题目大意:给你$n$,求:$$\sum\limits_{i=1}^n\varphi(i),\sum\limits_{i=1}^n\mu(i)$$最多$10$组数据,$n\leqslant2^{31}- ...
- Luogu 4213 【模板】杜教筛(Sum)
当作杜教筛的笔记吧. 杜教筛 要求一个积性函数$f(i)$的前缀和,现在这个东西并不是很好算,那么我们考虑让它卷上另外一个积性函数$g(i)$,使$(f * g)$的前缀和变得方便计算,然后再反推出这 ...
- P4213 【模板】杜教筛(Sum)
\(\color{#0066ff}{题 目 描 述}\) 给定一个正整数\(N(N\le2^{31}-1)\) 求 \(\begin{aligned} ans_1=\sum_{i=1}^n\varph ...
- luoguP4213 【模板】杜教筛(Sum)杜教筛
链接 luogu 思路 为了做hdu来学杜教筛. 杜教筛模板题. 卡常数,我加了register居然跑到不到800ms. 太深了. 代码 // luogu-judger-enable-o2 #incl ...
- 【模板】杜教筛(Sum)
传送门 Description 给定一个正整数\(N(N\le2^{31}-1)\) 求 \[ans1=\sum_{i=1}^n \varphi(i)\] \[ans_2=\sum_{i=1}^n \ ...
- P4213【模板】杜教筛(Sum)
思路:杜教筛 提交:\(2\)次 错因:\(\varphi(i)\)的前缀和用\(int\)存的 题解: 对于一类筛积性函数前缀和的问题,杜教筛可以以低于线性的时间复杂度来解决问题. 先要构造\(h= ...
- LG4213 【【模板】杜教筛(Sum)】
sum\(\mu\)求法 设 \[S(n)=\sum_{i=1}^n \mu(i)\] 回顾公式 \[\sum_{d|n}\mu(d)=[n=1]\] 对\(n\)求和 \[\sum_{i=1}^n\ ...
- P4213 【模板】杜教筛(Sum)(杜教筛)
根据狄利克雷卷积的性质,可以在低于线性时间复杂度的情况下,求积性函数前缀和 公式 \[ 求\sum_{i=1}^{n}\mu(i) \] 因为\(\mu*I=\epsilon\) 所以设\(h=\mu ...
随机推荐
- 好多鱼 Java
牛客网的题目: 链接:https://www.nowcoder.com/questionTerminal/e3dd485dd23a42899228305658457927牛牛有一个鱼缸.鱼缸里面已经有 ...
- Js里面的数组去重方法
去掉数组里面重复的有很多种,我这里就说一种比较简单的吧. var arr=[23,33,44,33,44,66,44,55,44,4,44,33,23]; for(var i=0;i<arr.l ...
- Kali linux learning note
from:http://blog.sina.com.cn/s/blog_40983e5e0101dhz0.html 因为kali linux基于debian 7,当然要把这台Acer 4736 ...
- JavaScript tips:数组去重
1.实现目标:数组去重 2.实现思路: (1)创建新数组. (2)遍历原数组,判断当前被遍历元素是否存在于新数组,如果存在于新数组,则判断当前被遍历元素是重复的:如果不存在于新数组,则判断当前被遍历元 ...
- 10分钟精通SharePoint - SharePoint升级
类型: b2b(安装更新)和v2v(跨版本升级) 内容:二进制文件和数据库 过程: 升级前检查 - 检查场内数据,配置和自定义等等 升级准备和计划 - 根据需要和升级检查制定相应计划和准备工作 ...
- Internet Information Services安装与启动
Internet Information Services安装 1.打开控制面板——程序——启动或关闭windows功能 2.找到Internet Information Services ——将其全 ...
- html5实例-闪烁的星星
一.绘制五角星 1.1页面结构 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...
- IE6 margin 双倍边距解决方案
一.什么是双边距Bug? 先来看图: 我们要让绿色盒模型在蓝色盒模型之内向左浮动,并且距蓝色盒模型左侧100像素.这个例子很常见,比如在网页布局中,侧边栏靠左侧内容栏浮动,并且要留出内容栏的宽度.要实 ...
- java做单用户的多重并发会话数限制
判定条件很简单,就是在同一时刻,同一帐号仅在一个终端上可正常操作. 我这里用简单的key,value进行判定,将用户存储在map里面,新登录用户登陆进系统后,判断map里是否存在当前用户,若存在就删除 ...
- keystone无法查看catalog并且用户无法申请令牌的解决方案
在运行openstack catalog list之后提示: Only an authorized user may issue a new token. #只有授权用户才能申请token opens ...