https://vjudge.net/problem/HDU-6069
算约数的个数
筛法的思想
WA了半天wuwuwu
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll M=998244353;
const int N=1e6;
int P[N+10];
vector<ll> V;
ll A[N+10],B[N+10];
int main(){
for(int i=2;i<=N;++i){
if(P[i]==0){
V.push_back(i);
for(int j=2*i;j<=N;j+=i)
P[j]=1;
}
}
ll len=V.size();
int T;
cin>>T;
while(T--){
ll l,r,k;
cin>>l>>r>>k;
for(int i=0;i<=N;++i)
A[i]=1;
ll ans=0;
for(int i=0;i<=r-l;++i)
B[i]=i+l;
for(ll i=0;i<len;++i){
for(ll j=(l-1)/V[i]*V[i]+V[i];j<=r;j+=V[i]){
ll b=0;
while(B[j-l]%V[i]==0){
B[j-l]/=V[i];
++b;
}
A[j-l]*=(1ll*b*k%M+1);
A[j-l]%=M;
}
}
for(ll i=0;i<=r-l;++i){
// cout<<A[i]<<" "<<i+l<<endl;
if(B[i]>1) A[i]=A[i]*(k+1)%M;
ans+=A[i];
ans%=M;
}
cout<<ans<<endl;
}
}
// 1 100000000 100100000 2