• 洛谷P3935 Calculating(整除分块)


    题目链接:洛谷

    题目大意:定义 $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$。

    $1leq lleq rleq 1.6 imes 10^{14}$。


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

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

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

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

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

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

    我们这样考虑:

    $1sim x$ 中有 $lfloorfrac{x}{1} floor$ 个 $1$ 的倍数,也就是有 $lfloorfrac{x}{1} floor$ 个数有约数 $1$。

    同理有 $lfloorfrac{x}{2} floor$ 个数有约数 $2$。

    有 $lfloorfrac{x}{3} floor$ 个数有约数 $3$。

    $dotsdots$

    有 $lfloorfrac{x}{i} floor$ 个数有约数 $i$。

    所以 $pre(x)=sum^x_{i=1}lfloorfrac{x}{i} floor$。

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

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

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

    好吧,$[l,r]$ 这段区间的和为 $lfloorfrac{x}{l} floor(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
    ",((solve(r)-solve(l-1))%mod+mod)%mod);    //前缀和相减
    17 }
    整除分块
  • 相关阅读:
    tbusers
    Dism解决win 10访问服务器共享问题,共享需要过时的SMB1协议,安装时错误代码:0x800736B3
    &【03】Python 变量与数据类型概览
    & 【01】 Spring源码编译
    &【02】Python 基础语法
    linux出现 -bash: fork: Cannot allocate memory 问题
    并发编程-15 ThreadPoolExecutor线程池
    Spring事务嵌套问题记录
    多线程笔试题记录
    & IDEA Debug启动失败或启动慢
  • 原文地址:https://www.cnblogs.com/1000Suns/p/9248336.html
Copyright © 2020-2023  润新知