【题目来源】:http://acm.hdu.edu.cn/showproblem.php?pid=6069;
【题意】
求所示式子的答案。
【思路】
这道题对于我挺绕的,当时比赛的时候想了一二十分钟,想了出来,但是实现的时候由于代码水平有限,以至于今天打了一遍过了,依旧找不出昨天的错误,思路基本和题解一致,用到了几个数论小知识,比如:求一个数的所有因子的数目可以通过素数的次幂进行相乘求解,然后就是一个模拟了。
【代码】
//先统计素因子数目,记录,最后相加。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn=1e6+10;
const int mod=998244353;
LL prime[maxn];
bool check[maxn];
LL p[maxn],q[maxn];
LL l,r,k;
int tot;
void pri()
{
check[1]=1;
for(int i=2; i<maxn; i++)
{
if(!check[i])prime[tot++]=i;
for(int j=0; j<tot&&i*prime[j]<maxn; j++)
{
check[i*prime[j]]=1;
if(i%prime[j]==0)break;
}
}
}
int main()
{
int T;
tot=0;
pri();
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld%lld",&l,&r,&k);
for(int i=0;i<=r-l;i++)
{
p[i]=l+i;
q[i]=1;
}
for(int i=0; i<tot; i++)
{
if(prime[i]*prime[i]>r) break;
LL L=l/prime[i];
LL j=prime[i]*(L+(l%prime[i]!=0));
for(;j<=r;j+=prime[i])
{
int tmp=0;
while(p[j-l]%prime[i]==0)
{
tmp++;
p[j-l]/=prime[i];
}
q[j-l]*=(k*tmp+1);
q[j-l]%=mod;
}
}
LL sum=0;
for(LL i=l; i<=r; i++)
{
if(p[i-l]!=1)
{
q[i-l]*=(k+1);
if(q[i-l]>=mod)
q[i-l]%=mod;
}
sum+=q[i-l];
if(sum>=mod)
sum%=mod;
}
printf("%lld\n",sum);
}
}