P3935 Calculating 洛谷题目链接 欢乐颓式子

欢乐颓式子

题目中要求:$$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;
}