码迷,mamicode.com
首页 > 其他好文 > 详细

hdu6069,2017多校1003

时间:2017-08-04 13:58:03      阅读:209      评论:0      收藏:0      [点我收藏+]

标签: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 }
View Code

 

hdu6069,2017多校1003

标签:gif   while   分解   view   ret   sum   code   线性筛   close   

原文地址:http://www.cnblogs.com/tuquanrong/p/7284496.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!