杜教筛 && 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 ...
随机推荐
- hdoj1016 [dfs]
http://acm.hdu.edu.cn/showproblem.php?pid=1016 题意: 已知一个数n,在1-n(包含 n ,0 < n < 20)里组合形成一个环形,使得每两 ...
- Web API框架学习——消息管道(二)
HttpServer的GlobalConfiguration中创建: GlobalConfiguration中确定了第一个HttpMessageHandler消息管道: 首:DefaultServer ...
- C#对委托的初步理解理解
作为新手对委托的学习: 1.定义委托:委托实际上是一个类,在定义委托前就知道了方法的返回类型和方法的参数类型(可以把委托理解为只知道方法的返回类型和方法的参数类型,不知道方法体) public de ...
- [LeetCode] 01 Matrix 题解
题意 # 思路 我一开始的时候想的是嘴 # 实现 ```cpp // // include "../PreLoad.h" class Solution { public: /** ...
- 2017-3-25 css样式表(一)
样式表: 一.样式表的概念:CSS(Cascading Style Sheets)层叠式样式表,作用是美化HTML网页. 二.样式表的分类:样式表分内联式样式表.内嵌式样式表和外部样式表三种. 1.内 ...
- 初学canvas,遇到width和height显示问题和用excanvas.js兼容IE问题
/*-----------------------ITEYE 祈祷幸福博客原创,转载请注明.-------------------*/ 第一次认真写技术博客文~~~若有不严谨的地方,望指正. 今天是第 ...
- Redis应用----消息传递
1.摘要 消息传递这一应用广泛存在于各个网站中,这个功能也是一个网站必不可少的.常见的消息传递应用有,新浪微博中的@我呀.给你评论然后的提示呀.赞赞赞提示.私信呀.甚至是发微博分享的新鲜事:知乎中的私 ...
- The superclass “javax.servlet.http.HttpServlet" was not found on the Java Build Path错误
1.异常信息 创建maven web项目时,出现 The superclass "javax.servlet.http.HttpServlet" was not found on ...
- 生成 HTMLTestRunner 测试报告学习总结
HTMLTestRunner 的安装与使用 HTMLTestRunner 是 Python 标准库的 unittest 模块的一个扩展. 在使用之前,我们需要先安装他.下载地址:https://pyp ...
- Linux 搭建svn版本库
一.安装svn服务器端yum install subversion 从镜像下载安装svn服务器端 如果后面执行“svnadmin create /usr/local/svn/sunny”提示 ...