BZOJ_3944_Sum_杜教筛

Description

Input

一共T+1行
第1行为数据组数T(T<=10)
第2~T+1行每行一个非负整数N,代表一组询问

Output

一共T行,每行两个用空格分隔的数ans1,ans2

Sample Input

6
1
2
8
13
30
2333

Sample Output

1 1
2 0
22 -2
58 -3
278 -3
1655470 2


学习下杜教筛,推一波式子。

首先有反演式子$\sum\limits_{d|n}\varphi(d)=n$

$\sum\limits_{i=1}^{n}\sum\limits_{d|i}\varphi(d)=\frac{n*(n+1)}{2}$

约数$j$出现了$n/j$次,故约数$j$将会在$i=n/j$时停止枚举。

相当于第$i$次枚举$1$到$n/i$中的数即可。

$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{\lfloor n/i\rfloor}
\varphi(j)=\frac{n*(n+1)}{2}$

$\sum\limits_{i=1}^{n}sum[n/i]=\frac{n*(n+1)}{2}$

$sum[n]+\sum\limits_{i=2}^{n}sum[n/i]=\frac{n*(n+1)}{2}$

然后记忆化搜索,每次可以分块求,总时间复杂度$O(n^{\frac{3}{4}})$。

根据均值不等式,预处理出$n^{\frac{2}{3}}$内的答案再用上面的式子能够最优。

总时间复杂度$O(n^{\frac{2}{3}}logn),log$是$map$带来的。

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <map>
using namespace std;
typedef long long ll;
ll prime[3000050],cnt,phi[3000050],miu[3000050],summiu[3000050];
ll sumphi[3000050];
bool vis[3000050];
map<ll,pair<ll,ll> >f;
map<ll,pair<ll,ll> >::iterator it;
void init() {
int i,j;
vis[1]=phi[1]=sumphi[1]=miu[1]=summiu[1]=1;
for(i=2;i<=3000000;i++) {
if(!vis[i]) {
prime[++cnt]=i;
phi[i]=i-1;
miu[i]=-1;
}
for(j=1;j<=cnt&&i*prime[j]<=3000000;j++) {
vis[i*prime[j]]=1;
if(i%prime[j]==0) {
phi[i*prime[j]]=phi[i]*prime[j];
miu[i*prime[j]]=0;
break;
}
miu[i*prime[j]]=-miu[i];
phi[i*prime[j]]=phi[i]*phi[prime[j]];
}
sumphi[i]=sumphi[i-1]+phi[i];
summiu[i]=summiu[i-1]+miu[i];
}
}
void query(ll n,ll &ans1,ll &ans2) {
if(n<=3000000) {
ans1=sumphi[n]; ans2=summiu[n];
return ;
}
it=f.find(n);
if(it!=f.end()) {
ans1=it->second.first; ans2=it->second.second;
return ;
}
ll i,lst;
ll tmp1,tmp2;
ans1=n*(n+1)/2; ans2=1;
for(i=2;i<=n;i=lst+1) {
lst=n/(n/i); query(n/i,tmp1,tmp2);
ans1-=(lst-i+1)*tmp1; ans2-=(lst-i+1)*tmp2;
}
f[n]=make_pair(ans1,ans2);
}
int main() {
init();
int T;
ll n,ans1,ans2;
scanf("%d",&T);
while(T--) {
scanf("%lld",&n);
query(n,ans1,ans2);
printf("%lld %lld\n",ans1,ans2);
}
}

BZOJ_3944_Sum_杜教筛的更多相关文章

  1. 51nod 1244 莫比乌斯函数之和(杜教筛)

    [题目链接] http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 [题目大意] 计算莫比乌斯函数的区段和 [题解] 利 ...

  2. 51nod 1237 最大公约数之和 V3(杜教筛)

    [题目链接] https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1237 [题目大意] 求[1,n][1,n]最大公约数之和 ...

  3. 杜教筛 && bzoj3944 Sum

    Description Input 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N,代表一组询问 Output 一共T行,每行两个用空格分隔的数ans1,ans ...

  4. 51NOD 1220 约数之和 [杜教筛]

    1220 约数之和 题意:求\(\sum_{i=1}^n \sum_{j=1}^n \sigma_1(ij)​\) \[ \sigma_0(ij) = \sum_{x\mid i}\sum_{y\mi ...

  5. BZOJ 4176: Lucas的数论 [杜教筛]

    4176: Lucas的数论 题意:求\(\sum_{i=1}^n \sum_{j=1}^n \sigma_0(ij)\) \(n \le 10^9\) 代入\(\sigma_0(nm)=\sum_{ ...

  6. 51NOD 1222 最小公倍数计数 [莫比乌斯反演 杜教筛]

    1222 最小公倍数计数 题意:求有多少数对\((a,b):a<b\)满足\(lcm(a,b) \in [1, n]\) \(n \le 10^{11}\) 卡内存! 枚举\(gcd, \fra ...

  7. 51NOD 1237 最大公约数之和 V3 [杜教筛]

    1237 最大公约数之和 V3 题意:求\(\sum_{i=1}^n\sum_{j=1}^n(i,j)\) 令\(A(n)=\sum_{i=1}^n(n,i) = \sum_{d\mid n}d \c ...

  8. hihocoder #1456 : Rikka with Lattice(杜教筛)

    hihocoder #1456 : Rikka with Lattice(杜教筛) 题意 : 给你一个\(n*m\)方格图,统计上面有多少个格点三角形,除了三个顶点,不覆盖其他的格点(包括边和内部). ...

  9. 【BZOJ4805】欧拉函数求和(杜教筛)

    [BZOJ4805]欧拉函数求和(杜教筛) 题面 BZOJ 题解 好久没写过了 正好看见了顺手切一下 令\[S(n)=\sum_{i=1}^n\varphi(i)\] 设存在的某个积性函数\(g(x) ...

随机推荐

  1. CDH安装系统环境准备——虚拟机网络配置

    虚拟机网络配置教程如下: 1.修改网络配置文件[root@master ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0配置IP地址.网关.掩码.DNS ...

  2. mongodb3.6 (五)net 客户端访问mongodb设置超时时间踩过的“坑”

    前言 在上一篇文章中,我们有提到net访问mongodb连接超时默认为30秒,这个时间在实际项目中肯定是太长的.而MongoClientSettings 也确是提供了超时属性,如下图: 可实际使用中, ...

  3. java程序的内存分配(二)

    前言 您是否是动态分配的 C/C++ 对象忠实且幸运的用户?您是否在模块间的往返通信中频繁地使用了"自动化"?您的程序是否因堆分配而运行起来很慢?不仅仅您遇到这样的问题.几乎所有项 ...

  4. nslookup查询结果详解

    nslookup可以指定查询的类型,可以查到DNS记录的生存时间还可以指定使用那个DNS服务器进行解释.在已安装TCP/IP协议的电脑上面均可以使用这个命令.主要用来诊断域名系统 (DNS) 基础结构 ...

  5. Day6_正则表达式

    用作匹配数据的方法: print(re.findall('\w','yangshuai 123 asd \n \t')) #w:匹配字母数字下划线 print(re.findall('\W','yan ...

  6. MFC半透明对话框

    int CTestDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) ...

  7. codechef Chef And Easy Xor Queries

    做法:我们考虑前缀异或和,修改操作就变成了区间[i,n]都异或x 查询操作就变成了:区间[1,x]中有几个k 显然的分块,每个块打一个tag标记表示这个块中所有的元素都异或了tag[x] 然后处理出这 ...

  8. Quartz学习-- quartz基本介绍和 Cron表达式

    Quartz学习 一. Quartz 大致简介 Quartz 是完全由 java 开发的一个开源的任务日程管理系统 ​任务日程管理系统 换句话说就是: ​ 一个预先确定的日程时间到达时,负责执行任务的 ...

  9. Vue作者尤雨溪:以匠人的态度不断打磨完善Vue (图灵访谈)

    访谈对象: 尤雨溪,Vue.js 创作者,Vue Technology创始人,致力于Vue的研究开发. 访谈内容: 你为何选择从事前端方面的工作? 其实,我本科读的是艺术史,研究生阶段学习Design ...

  10. memcached安装、使用

    Memcached客户端01:XMemcached 版本选择:2.0.0 XMemcached:https://github.com/killme2008/xmemcached     XMemcac ...