我们先枚举一个最大质因子,然后设 \(dp[n][k]\) 为 \(n\) 以内使用了 \(pri[k]\) 以内的质数的数的最大质因子之和,答案就是:

\[\sum_{k\leq n}dp[\lfloor\frac{n}{pri[k]}\rfloor][k]
\]

当 \(pri[k]\) 大于 \(\sqrt{n}\) 时,后面相当于变成 \(\sqrt{n}\) 以内所有数的最大质因子之和,可以线性筛,质数个数也可以使用叶筛解决。

考虑这个 \(dp\) 怎么办。

根据上面的东西,我们设一个 \(g[n][k]\) 为 \(n\) 以内使用了 \(pri[k]\) 以内的质数的数的个数。有:

\[dp[n][k]=\sum_{i=1}^{k}g[\lfloor\frac{n}{pri[i]}\rfloor][i]\times pri[i]
\]

只要一边筛 \(g\) 一边丢到 \(dp\) 数组里边就好了。

但是注意到丢进去的复杂度是 \(O(\frac{n}{\ln^2n})\) 的,考虑优化。。。

这个 \(g\) 是十分经典的叶筛。\(g\) 的定义为仅用过 \([1,pri[k]]\) 的质数,叶筛的 \(f\) 定义为 \([1,pri[k]]\) 的的质数都没被使用过,即最小质因子为 \(pri[k]\)。

转移可以参考这个过程。得到有:

\[g[n][k]=g[n][k-1]+g[\frac{n}{pri[k]}][k]
\]

当 \(pri[k]^2\geq n\) 时,有:

\[g[n][k]=g[n][k-1]+\lfloor\frac{n}{pri[k]}\rfloor
\]

转移的话可以使用叶筛的那种转移,滚动数组就好了()

然后,对于 \(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\) 计算答案:

\[\sum_{i=1}^{k}\sum_{j=1}^{i}g[\lfloor\frac{n}{pri[i]pri[j]}\rfloor][j]\times pri[j]
\]
\[\sum_{j=1}^{k}pri[j]\times \sum_{i=j}^{k}g[\lfloor\frac{\lfloor\frac{n}{pri[j]}\rfloor}{pri[i]}\rfloor][j]
\]

我们提前使用叶筛处理质数个数,然后后面对着这个直接整除分块就好了。

复杂度是:

\[O(\sum_{i=1}^{\frac{\sqrt{n}}{\ln n}}\sqrt{\frac{n}{i\ln i}})
\]
\[O(\frac{\int_{1}^{\frac{\sqrt{n}}{\ln n}}\frac{\sqrt{n}}{\sqrt{x}}{\rm d}x}{\sqrt{\ln n}})
\]
\[O(\frac{\sqrt{n}\int_{1}^{\frac{\sqrt{n}}{\ln n}}x^{-\frac{1}{2}}{\rm d}x}{\sqrt{\ln n}})
\]
\[O(\frac{n^{\frac{3}{4}}}{\log n})
\]

加上叶筛,复杂度是 \(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\) 以内质数个数,那么这玩意儿看上去是这样的:

\[S(n,k)=\sum_{k<K,p\leq \sqrt{n},p^K\leq n}S(\lfloor\frac{n}{p^K}\rfloor,K)+p\times(f[\lfloor\frac{n}{p^K}\rfloor]-K+1)
\]
#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题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. 使用C++开发PHP扩展

    目前,PHP编程语言也是相当成熟,各种文档,各种问题,只要Google一下,总有你想要的答案.当然"如何开发PHP扩展"的文章也不少,但是很少有专门来介绍使用C++开发PHP扩展的 ...

  2. mysql处理警告 Warning: Using a password on the command line interface can be insecure.

    vim /etc/mysql/my.cnf [mysqldump] user=user_name password=password 格式: [只用密码的命令] user=用户名 password=密 ...

  3. java多线程编程(二)

    1. wait 和 sleep 区别? 1.wait可以指定时间也可以不指定,sleep必须指定时间. 2.在同步中时,对cpu的执行权和锁的处理不同.  wait:释放执行权,释放锁.  sleep ...

  4. 【struts2】中method={1}详解

    我们在使用struts2的时候,有时候为了简化struts2的配置项而采用通配符的方式,如下代码: <action name="ajaxregister!*" class=& ...

  5. 3.Flink实时项目之流程分析及环境搭建

    1. 流程分析 前面已经将日志数据(ods_base_log)及业务数据(ods_base_db_m)发送到kafka,作为ods层,接下来要做的就是通过flink消费kafka 的ods数据,进行简 ...

  6. 社交网络分析的 R 基础:(五)图的导入与简单分析

    如何将存储在磁盘上的邻接矩阵输入到 R 程序中,是进行社交网络分析的起点.在前面的章节中已经介绍了基本的数据结构以及代码结构,本章将会面对一个实质性问题,学习如何导入一个图以及计算图的一些属性. 图的 ...

  7. Solution -「ABC 213H」Stroll

    \(\mathcal{Description}\)   Link.   给定一个含 \(n\) 个结点 \(m\) 条边的简单无向图,每条边的边权是一个常数项为 \(0\) 的 \(T\) 次多项式, ...

  8. Solution -「COCI 2014-2015 #2」「洛谷 P6406」Norma

    \(\mathcal{Description}\)   Link.   给定 \(\{a_n\}\),求: \[\sum_{i=1}^n\sum_{j=i}^n(j-i+1)\min_{k=i}^j\ ...

  9. C#的in/out关键字与协变逆变

    C#提供了一组关键字in&out,在泛型接口和泛型委托中,若不使用关键字修饰类型参数T,则该类型参数是不可变的(即不允许协变/逆变转换),若使用in修饰类型参数T,保证"只将T用于输 ...

  10. 浅谈C#字符串构建利器StringBuilder

    前言 在日常的开发中StringBuilder大家肯定都有用过,甚至用的很多.毕竟大家都知道一个不成文的规范,当需要高频的大量的构建字符串的时候StringBuilder的性能是要高于直接对字符串进行 ...