题意:。。一个公式
思路:和区间筛类似POJ 2689。。。筛出L,R的每个质因数的个数即可,然后简单的组合公式,就可以算出i的k次方的约数个数
PS。。vector乱搞会卡常。。
代码:
#include<bits/stdc++.h>
using namespace std;
#define MEM(a,b) memset(a,b,sizeof(a))
#define PB push_back
#define MP make_pair
#define X first
#define Y second
#define bug puts("bug");
typedef long long ll;
const int maxn=1e6+10;
const int MAXN=1000010;
const int mo=998244353;
ll prime[MAXN+1];
void getPrime(){
memset(prime,0,sizeof(prime));
for(int i=2; i<=MAXN; i++){
if(!prime[i])prime[++prime[0]]=i;
for(int j=1; j<=prime[0]&&prime[j]<=MAXN/i; j++){
prime[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
}
ll t,l,r,k;
ll X[maxn],A[maxn];
int main(){
getPrime();
scanf("%d",&t);
while(t--){
scanf("%lld%lld%lld",&l,&r,&k);
for(ll i=l;i<=r;i++) X[i-l]=i,A[i-l]=1;
ll ans=0,ret,be,p;
for(ll i=1;prime[i]*prime[i]<=r&&i<prime[0];++i){
be=l-l%prime[i],p=prime[i];
if(be<l) be+=p;
for(ll j=be;j<=r;j+=p){
ret=1;
while(X[j-l]%p==0){
ret=(ret+k)%mo;
X[j-l]/=p;
}
A[j-l]=(A[j-l]*ret)%mo;
}
}
for(ll i=l;i<=r;i++) if(X[i-l]!=1) A[i-l]=(A[i-l]*(k+1))%mo;
for(ll i=l;i<=r;i++)ans=(A[i-l]+ans)%mo;
printf("%lld
",ans);
}
return 0;
}