UOJ188题解
我们先枚举一个最大质因子,然后设 \(dp[n][k]\) 为 \(n\) 以内使用了 \(pri[k]\) 以内的质数的数的最大质因子之和,答案就是:
\]
当 \(pri[k]\) 大于 \(\sqrt{n}\) 时,后面相当于变成 \(\sqrt{n}\) 以内所有数的最大质因子之和,可以线性筛,质数个数也可以使用叶筛解决。
考虑这个 \(dp\) 怎么办。
根据上面的东西,我们设一个 \(g[n][k]\) 为 \(n\) 以内使用了 \(pri[k]\) 以内的质数的数的个数。有:
\]
只要一边筛 \(g\) 一边丢到 \(dp\) 数组里边就好了。
但是注意到丢进去的复杂度是 \(O(\frac{n}{\ln^2n})\) 的,考虑优化。。。
这个 \(g\) 是十分经典的叶筛。\(g\) 的定义为仅用过 \([1,pri[k]]\) 的质数,叶筛的 \(f\) 定义为 \([1,pri[k]]\) 的的质数都没被使用过,即最小质因子为 \(pri[k]\)。
转移可以参考这个过程。得到有:
\]
当 \(pri[k]^2\geq n\) 时,有:
\]
转移的话可以使用叶筛的那种转移,滚动数组就好了()
然后,对于 \(pri[k]^2\geq n\) 的情况,相当于令一个若干个区间加上若干个值。我们对 \([1,\lfloor\sqrt{n}\rfloor]\) 和 \(\lfloor\frac{n}{i}\rfloor\) 分开考虑。
对于前者,直接把所有区间找出来加上就好了。复杂度是 \(O(\sum_{i=1}^{\frac{\sqrt{n}}{\ln n}}\min(i,\frac{\sqrt{n}}{i\log i}))\leq O(\sum_{i=1}^{\frac{\sqrt{n}}{\ln n}}\frac{\sqrt{n}}{i\log i})\),后者也是相同的复杂度。
处理 \(g\) 对 \(dp\) 的贡献复杂度过高,考虑直接使用 \(g\) 计算答案:
\]
\]
我们提前使用叶筛处理质数个数,然后后面对着这个直接整除分块就好了。
复杂度是:
\]
\]
\]
\]
加上叶筛,复杂度是 \(O(\frac{n^{\frac{3}{4}}}{\log n})\)。
注意到每次更新的是一段后缀的 \(g\),所以对于后缀完全可以直接动态地维护前缀和。复杂度 \(O(\frac{n^{\frac{3}{4}}}{\log n})\)。
对于前缀,考虑每个修改区间对答案的影响。
注意到我们是先进行一些修改,然后进行一些查询,一共 \(O(\frac{\sqrt{n}}{\ln n})\) 轮。
区间修改区间查询可以使用树状数组的差分方式变成单点修改前缀和。我们考虑使用分块来代替这个树状数组。
考虑块长为 \(B\),每次在块内做后缀和,结束后大块做前缀和,查询 \(O(1)\),复杂度是 \(O(\frac{n^{\frac{3}{4}}}{\ln n}\times B+\frac{n}{B\ln n})\),取 \(B=n^{\frac{1}{8}}\) 可以做到 \(O(\frac{n^{\frac{7}{8}}}{\ln n})\) 的复杂度。怎么这么奇怪啊
这玩意儿当个乐呵就好了。。。。。。下面是正经部分。
考虑怎么通过类似 min25 筛的爆搜去搜这个东西。
每次搜质因子的时候,我们枚举一下这个质因子是否为这个数的次大质因子。如果是,那就在后面跟上一个质数前缀和,否则就接着搜下去。
设 \(f[n]\) 为 \(n\) 以内质数个数,那么这玩意儿看上去是这样的:
\]
#include<cstdio>
typedef unsigned ui;
typedef __uint128_t LL;
typedef unsigned long long ull;
const ui M=1e6+5;
ull l,r;ui g[M];ull f[M];ull B[M];
ui m,top,pri[M];
inline ull DFS(const ull&n,const ui&k,const ull&T){
if(n<=pri[k])return 0;
ull ans(0);
for(ui K=k+1;K<=top&&1ull*pri[K]*pri[K]<=n;++K){
const ui&P=pri[K];const ull&BR=B[P];ull N=LL(n)*BR>>63,M=P;
while(P<=N){
ans+=DFS(N,K,T*M)+P*((N<=m?g[N]:f[T*M])-K+1);
N=LL(N)*BR>>63;M*=P;
}
}
return ans;
}
inline ull Solve(const ull&n){
top=0;m=1;
while(1ull*m*m<=n){
B[m]=((1ull<<63)+m-1)/m;
g[m]=m-1;f[m]=n/m-1;
++m;
}
B[m]=((1ull<<63)+m-1)/m;--m;
for(ui i=2;i<=m;++i)if(g[i]^g[i-1]){
const ull&x=LL(n)*B[i]>>63;const ui&Lim=LL(m)*B[i]>>63,&S=g[i-1];ui lim=m;
if(1ull*lim*i>x)lim=LL(x)*B[i]>>63;
pri[++top]=i;
for(ui j=1;j<=lim;++j){
if(j<=Lim)f[j]-=f[i*j]-S;
else f[j]-=g[LL(x)*B[j]>>63]-S;
}
if(1ull*i*i<=m){
for(ui j=m;j>=i*i;--j){
g[j]-=g[LL(j)*B[i]>>63]-S;
}
}
}
return DFS(n,0,1);
}
signed main(){
scanf("%llu%llu",&l,&r);
printf("%llu",Solve(r)-Solve(l-1));
}
UOJ188题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- synchronized类锁,对象锁,方法锁
synchronized从语法的维度一共有3个用法: 静态方法加上关键字 实例方法(也就是普通方法)加上关键字 方法中使用同步代码块 前两种方式最为偷懒,第三种方式比前两种性能要好. synchron ...
- LVS负载均衡群集部署——DR模式
LVS负载均衡群集部署--DR模式 1.LVS-DR概述 2.部署实验 1.LVS-DR概述: LVS-DR(Linux Virtual Server Director Server)工作模式,是生产 ...
- OSPF路由协议基础知识
OSPF路由协议 1.OSPF的基本概念 2.OSPF邻接关系的建立 3.OSPF的应用环境 4.OSPF的基本配置命令 1.OSPF区域为了适应大型的网络,OSPF在AS(自治系统)内划分多个区域. ...
- 03并发编程(多道技术+进程理论+进程join方法)
目录 03 并发编程 03 并发编程
- 《PHP程序员面试笔试真题解析》——新书上线
你好,是我--琉忆.很高兴可以跟你分享我的新书. 很高兴,在出版了PHP程序员面试笔试宝典后迎来了我的第二本书出版--<PHP程序员面试笔试真题解析>. 如果你是一个热爱PHP的程序员,刚 ...
- [LeetCode]66.加一(Java)
原题地址: plus-one 题目描述: 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字. 你可以假设除了整数 ...
- C1 能力认证——Web进阶
C1 能力认证--Web进阶 DOM节点操作-上 名称 描述 getElementById() 获取带有指定id的节点 getElementsByTagName() 获取带有指定标签名的节点集合 qu ...
- 深入MySQL(三):MySQL的索引的应用
在MySQL的优化中,索引的作用绝对算是一个大头,很多时候索引使用得当可以使得一个查询的效率提高几个数量级,同时它还具有自动排序等功能.所以如果是深入MySQL,那么索引绝对是其中重要的一部分. My ...
- 大厂晋升指南:材料准备,PPT 写作和现场答辩
大部分公司在年初,都是绩效回顾.晋升答辩的时期,对于阿里.美团等不少互联网企业,财年是从前一年的 4 月到第二年的 3 月底,春节回来以后,就是一年一度的述职晋升环节. 这里我结合自己述职以及辅导其他 ...
- 记一次 .NET 某供应链WEB网站 CPU 爆高事故分析
一:背景 1. 讲故事 年前有位朋友加微信求助,说他的程序出现了偶发性CPU爆高,寻求如何解决,截图如下: 我建议朋友用 procdump 在 cpu 高的时候连抓两个dump,这样分析起来比较稳健, ...