- Counting Divisors
In mathematics, the function
d(n)
d(n) denotes the number of divisors of positive integer
n
n.
For example,
d(12)=6
d(12)=6 because
1,2,3,4,6,12
1,2,3,4,6,12 are all
12
12's divisors.
In this problem, given
l,r
l,r and
k
k, your task is to calculate the following thing :
(∑i=lrd(ik))mod998244353
(∑i=lrd(ik))mod998244353
Input
In each test case, there are 3 3 integers l,r,k(1≤l≤r≤1012,r−l≤106,1≤k≤107) l,r,k(1≤l≤r≤1012,r−l≤106,1≤k≤107) .
3 1 5 1 1 10 2 1 100 3
10 48 2302
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#define maxn 1000100
using namespace std;
typedef long long ll;
ll l,r,k;
bool vis[maxn];
int prime[maxn];
ll a[maxn],b[maxn];
int len;
const ll MOD=998244353;
void init()
{
len=0;
for(int i=2; i<maxn; i++)
{
if(!vis[i])
prime[len++]=i;
for(int j=0; j<len&&i*prime[j]<maxn; j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)
break;
}
}
}
int main()
{
int T;
scanf("%d",&T);
init();
while(T--)
{
ll ans=0;
scanf("%lld%lld%lld",&l,&r,&k);
for(ll i=0;i<r-l+1;i++)
{
a[i]=i+l; //记录每个数字的最后状态
b[i]=1; //存每个数字的贡献值
}
for(ll i=0;i<len&&prime[i]<=r;i++)
{
ll tem,t;
ll cnt=(l-1+prime[i])/prime[i]*prime[i];
while(cnt<=r)
{
t=cnt;
tem=0;
while(t%prime[i]==0)
{
tem++;
t/=prime[i];
a[cnt-l]/=prime[i];
}
b[cnt-l]=((b[cnt-l]%MOD)*((k*tem+1)%MOD))%MOD;
cnt+=prime[i];
}
}
for(ll i=0;i<r-l+1;i++)
{
if(a[i]==1)
ans=(ans+b[i])%MOD;
else
ans=(ans+((b[i]%MOD)*((k+1)%MOD)))%MOD;
}
printf("%lld\n",ans);
}
}