给一个起点为l终点为r的区间,求这个区间内的数的k次方的全部因子有多少个。
设 n=p1^c1*p2^c2...,则d(n^k)=(k*c1+1)(k*c2+1)...,r-l>=1e6
先筛出10^6内的素数,再分解出[l,r]里面的质因子,大于1e6的质数直接为(k+1)个因子。
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define PI acos(-1.0)
typedef long long ll;
const int maxn=1e6+10;
const ll mod=998244353;
ll vis[maxn],p[maxn],a[maxn],num[maxn],ans;
ll l,r,k;
void solve(int pp)
{
for(ll i=l/pp*pp;i<=r;i+=pp)
{
if(i>=l)
{
int cnt=0;
while(a[i-l]%pp==0&&a[i-l])
a[i-l]/=pp,cnt++;
num[i-l]=1LL*num[i-l]*(cnt*k+1)%mod;
}
}
}
int main()
{
int cnt=0;
for(int i=2;i<maxn;i++)
{
if(!vis[i])
p[cnt++]=i;
for(int j=0;j<cnt&&1LL*i*p[j]<maxn;j++)
{
vis[1LL*p[j]*i]=1;
if(i%p[j]==0)
break;
}
}
int t;
scanf("%d",&t);
while(t--)
{
ans=0;
scanf("%lld%lld%lld",&l,&r,&k);
int n=r-l;
for(int i=0;i<=n;i++)
a[i]=i+l,num[i]=1;
for(int i=0;i<cnt;i++)
{
if(1LL*p[i]*p[i]>r)
break;
solve(p[i]);
}
for(int i=0;i<=n;i++)
{
if(a[i]>1)
num[i]=1LL*num[i]*(k+1)%mod;
}
for(int i=0;i<=n;i++)
ans=(ans+num[i])%mod;
printf("%lld\n",ans);
}
return 0;
}