P3935 Calculating

欢乐颓式子

题目中要求:\[\sum\limits_{i=l}^r f(i)\]

我们首先容斥一下,那么原式表示为:\[\sum\limits_{i=1}^r f(i)- \sum\limits_{j=1}^{l-1} f(j)\]

那么我们就要想着求出:\[\sum\limits_{i=1}^n f(i)\]

那么\(f(x)\)怎么求呢,其实\(f(x)\)就是\(x\)的因数个数,为什么呢?

我们把\(x\)分解质因数,假设\(x=p_1^{k_1}p_2^{k_2}p_3^{k_3}\cdots p_m^{k_m}\)

对于每一个\(p_i^{k_i}\)都是质数,它的因数有\(p_i^0,p_i^1,p_i^2,\cdots,p_i^{k_i}\),也就是一共有\(k_i+1\)个因数

那么\(x\)一共就会有\((k_1+1)(k_2+1)(k_3+1)\cdots (k_m+1)\)个因数

所以上面的式子可以化为:\[\sum\limits_{i=1}^n \sum\limits_{d|i} 1\]

我们把枚举的东西换一下,我们枚举所有的因数:

\[\sum\limits_{d=1}^n \left\lfloor \frac{n}{d} \right\rfloor \]

那么上式我们就可以用整除分块来做,如果不会整除分块的话,可以看看我的另一篇博客

接下来是美滋滋的代码时间~~~


#include<iostream>
#include<cstdio>
#include<cstring>
#define mod 998244353
#define int long long
using namespace std;
int l,r;
int Get(int x)
{
    int ans=0;
    for(int i=1,j;i<=x;i=j+1)
    {
        j=x/(x/i);
        ans=(ans+(((x/i)%mod)*((j-i+1)%mod)%mod)%mod)%mod;
    }
    return ans;
}
signed main()
{
    scanf("%lld%lld",&l,&r);
    printf("%lld",(Get(r)-Get(l-1)+mod)%mod);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/yexinqwq/p/11102749.html