[P3935] Calculating - 整除分块

容易发现题目要求的 \(f(x)\) 就是 \(x\) 的不同因子个数

现在考虑如何求 \(\sum_{i=1}^n f(i)\),可以考虑去算每个数作为因子出现了多少次,很容易发现是 \([n/i]\)

于是整除分块一下就可以了

#include 
using namespace std;

#define int long long
const int mod = 998244353;

int f(int n) {
    int l=1,ans=0;
    while(l<=n) {
        int r=n/(n/l);
        (ans+=(r-l+1)*(n/l))%=mod;
        l=r+1;
    }
    return ans;
}

signed main() {
    int l,r;
    cin>>l>>r;
    cout<<(mod+f(r)-f(l-1))%mod<

你可能感兴趣的:([P3935] Calculating - 整除分块)