洛谷 P3935 Calculating

洛谷 P3935 Calculating

题解

整除分块的裸题,整除分块用于求解 \(\sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloor\)

\(f_x = (k_1+1)(k_2+1)⋯(k_n+1)\) 表示 \(x\) 的因子的个数。

\(\sum_{i=1}^{n} f_x\) 表示区间 \([1,n]\) 所有的数的因子的个数。

可以进一步求 \([1,n]\) 这个区间每个因子出现的次数,

例如:因子\(x\) 出现的次数为 \(\lfloor\frac{n}{x}\rfloor\) ,进而为 \(\sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloor\)

\(\sum_{i=l}^{r} f_x =\sum_{i=1}^{r} f_x - \sum_{i=1}^{l-1} f_x\)

\(\sum_{i=l}^{r} f_x =\sum_{i=1}^{r}\lfloor\frac{r}{i}\rfloor - \sum_{i=1}^{l-1}\lfloor\frac{l-1}{i}\rfloor\)

代码

#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
const ll mod = 998244353;
int main(){
    ll a,b,cnt=0;
    cin>>a>>b;
    for(ll l=1,r;l<=b;l=r+1){
        r=b/(b/l);
        cnt+=(r-l+1)*(b/l);
        cnt%=mod;
    }
    --a;
    for(ll l=1,r;l<=a;l=r+1){
        r=a/(a/l);
        cnt-=(r-l+1)*(a/l);
        cnt=(cnt%mod+mod)%mod;
    }
    cout<<(cnt%mod+mod)%mod<<endl;
    return 0;
}
上一篇:Swift的闭包(一):闭包简介、闭包表达式的优化


下一篇:【代码笔记】iOS-图文混排(HBLabelDemo)