1. 程式人生 > >hdu6069,2017多校1003

hdu6069,2017多校1003

turn class == 一道 sca lld spl void line

這是一道區間素數篩的題目,首先線性篩出1e6的素數,然後用每一個素數對區間內的數進行素數分解

公式:求某個數的因子個數,先進行素數分解x=p1^z1*p2^z2*p3^z3;

然後 sum=(z1+1)*(z2+1)*(z3+1);

技術分享
 1 #include <cstdio>
 2 typedef long long ll;
 3 const int N=1000010,P=998244353;
 4 bool v[N];
 5 ll n,l,r,f[N];
 6 int i,j,k,Case,p[N/10],tot,g[N],ans;
 7 
 8 inline void work(ll p){
9 for(ll i=l/p*p;i<=r;i+=p)if(i>=l){ 10 int o=0; 11 while(f[i-l]%p==0)f[i-l]/=p,o++; 12 g[i-l]=1LL*g[i-l]*(o*k+1)%P; 13 } 14 } 15 16 int main() 17 { 18 for( i=2; i<N; i++) 19 { 20 if(!v[i])p[tot++]=i; 21 for( j=0; j<tot&&i*p[j]<N; j++) 22 {
23 v[i*p[j]]=1; 24 if(i%p[j]==0)break; 25 } 26 } 27 scanf("%d",&Case); 28 while(Case--) 29 { 30 scanf("%lld%lld%d",&l,&r,&k); 31 n=r-l; 32 for( i=0; i<=n; i++)f[i]=l+i,g[i]=1; 33 for( i=0; i<tot; i++)
34 { 35 if(1ll*p[i]*p[i]>r)break; 36 work(p[i]); 37 } 38 ans=0; 39 for( i=0; i<=n; i++) 40 { 41 if(f[i]>1) 42 g[i]=1ll*g[i]*(k+1)%P; 43 ans=(ans+g[i])%P; 44 } 45 printf("%d\n",ans); 46 } 47 return 0; 48 }
View Code

hdu6069,2017多校1003