hdu6069,2017多校1003

这是一道区间素数筛的题目,首先线性筛出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

 

posted @ 2017-08-04 12:58  被咬过的馒头  阅读(98)  评论(0编辑  收藏  举报