洛谷题目链接
欢乐颓式子
题目中要求:$$sumlimits_{i=l}^r f(i)$$
我们首先容斥一下,那么原式表示为:$$sumlimits_{i=1}^r f(i)- sumlimits_{j=1}^{l-1} f(j)$$
那么我们就要想着求出:$$sumlimits_{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))个因数
所以上面的式子可以化为:$$sumlimits_{i=1}^n sumlimits_{d|i} 1$$
我们把枚举的东西换一下,我们枚举所有的因数:
[sumlimits_{d=1}^n leftlfloor frac{n}{d}
ight
floor
]
那么上式我们就可以用整除分块来做,如果不会整除分块的话,可以看看我的另一篇博客
接下来是美滋滋的代码时间~~~
#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;
}