标签:gif while 分解 view ret sum code 线性筛 close
这是一道区间素数筛的题目,首先线性筛出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 }
标签:gif while 分解 view ret sum code 线性筛 close
原文地址:http://www.cnblogs.com/tuquanrong/p/7284496.html