首页 > 其他 > 详细

Calculating(洛谷P3935)(整除分块)

时间:2018-06-30 19:32:59      阅读:318      评论:0      收藏:0      [点我收藏+]

题目链接:洛谷

题目大意:定义 $f(x)=\prod^n_{i=1}(k_i+1)$,其中 $x$ 分解质因数结果为 $x=\prod^n_{i=1}{p_i}^{k_i}$。求 $\sum^r_{i=l}f(i)\ mod\ 998244353$。

$1\leq l\leq r\leq 1.6\times 10^{14}$。


阅读以下内容前请先学会前置技能整除分块

先分析一下 $f(x)$ 的本质。

(读者:不要啰嗦来啰嗦去的好吧!这明显是 $x$ 的约数个数吗!是不是想拖延时间?)

好好好,你赢了。我们来看看如何计算。

看到区间 $[l,r]$ 函数求和,我们应该想到拆成前缀和 $pre(r)-pre(l-1)$。

现在看一看 $pre(x)=\sum^x_{i=1}f(i)$ 如何计算。

我们这样考虑:

$1\sim x$ 中有 $\lfloor\frac{x}{1}\rfloor$ 个 $1$ 的倍数,也就是有 $\lfloor\frac{x}{1}\rfloor$ 个数有约数 $1$。

同理有 $\lfloor\frac{x}{2}\rfloor$ 个数有约数 $2$。

有 $\lfloor\frac{x}{3}\rfloor$ 个数有约数 $3$。

$\dots\dots$

有 $\lfloor\frac{x}{i}\rfloor$ 个数有约数 $i$。

所以 $pre(x)=\sum^x_{i=1}\lfloor\frac{x}{i}\rfloor$。

这个……不就是整除分块模板了吗?

对于一段如何求和难度应该不大,可以自己推出来。

(读者:喂,别这么不良心好吧!)

好吧,$[l,r]$ 这段区间的和为 $\lfloor\frac{x}{l}\rfloor(r-l+1)$。

时间复杂度 $O(\sqrt{r})$,空间复杂度 $O(1)$。


 

既然是模板题一道,那就直接上代码。

技术分享图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const ll mod=998244353;
 5 ll l,r;
 6 ll solve(ll x){    //整除分块
 7     ll ans=0;
 8     for(ll l=1,r;l<=x;l=r+1){
 9         r=x/(x/l);    //左边界推算右边界
10         ans=(ans+(r-l+1)*(x/l))%mod;    //求和
11     }
12     return ans;
13 }
14 int main(){
15     scanf("%lld%lld",&l,&r);
16     printf("%lld\n",((solve(r)-solve(l-1))%mod+mod)%mod);    //前缀和相减
17 }
整除分块

Calculating(洛谷P3935)(整除分块)

原文:https://www.cnblogs.com/1000Suns/p/9248336.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!