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 & ...
随机推荐
- 匿名内部类不能访问外部类方法中的局部变量,除非变量被声明为final类型
1. 这里所说的"匿名内部类"主要是指在其外部类的成员方法内定义,同时完成实例化的类,若其访问该成员方法中的局部变量,局部变量必须要被final修饰.2. 原因是编译程序实现上的困 ...
- 自定义UITableview自带侧滑删除按钮样式 by 徐
效果如下: 实现原理: 1.打开tableview自带的侧滑删除功能 核心代码: 1 -(void)tableView:(UITableView *)tableView commitEditingSt ...
- make小tip
总所周知make一般需要Makefile才能编译相关源码,但也可以无需Makefile就能编译一些简单的源代码. 在算法竞赛里,一道题的源程序一般只有一个文件,此时用Makefile显得十分累赘,但如 ...
- C#设置进程PATH环境变量值解决某些Win32DLL找不到路径问题
C#.NET通过设置当前进程PATH环境变量值解决某些Win32DLL找不到路径问题 以下函数设置PATH环境变量值(请注意:该环境变量为当前进程的环境变量,非系统环境变量)用于解决在调用某些Win3 ...
- Python中编码encode()与解码decode()
1 print('这是编码'.encode('utf-8')) # 结果 b'\xe8\xbf\x99\xe6\x98\xaf\xe7\xbc\x96\xe7\xa0\x81' 2 print('这是 ...
- 攻防世界之Web_php_unserialize
题目: <?php class Demo { private $file = 'index.php'; public function __construct($file) { ...
- 开源爱好者月刊《HelloGitHub》第 71 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...
- kali linux清理垃圾
sudo apt-get autoclean # 清理旧版本的软件缓存 sudo apt-get clean # 清理所有软件缓 ...
- 3款自助型BI分析平台功能盘点,帮助你预测商业发展方向
在快速发展的今天,商业智能BI已经不同于传统的商业智能BI,商业智能BI已经逐渐转变为自助和业务主导的模式,自助BI分析平台应运而生,自助BI分析平台逐渐成为许多企业的选择. 自助式BI分析平台与传统 ...
- 善用商业智能BI系统,让数据分析更智能
数据分析,是一种基于系统化分析问题的方式,是一种手段,也可以是一种工具,可以很简单也可以很复杂.它可以用在各个场景,比如现在的B2C\B2B--等等. 简单点的例子:通过分析购买产品的人大多都来自于北 ...