hdu6069,2017多校1003

Posted 被咬过的馒头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于hdu6069,2017多校1003的主要内容,如果未能解决你的问题,请参考以下文章

hdu6069 多校Counting Divisors

hdu_6047: Maximum Sequence (2017 多校第二场 1003)贪心

2017多校Round3(hdu6056~hdu6066)

多校第六场 1003 hdu 5355 Cake(贪心)

HDU 6069 Counting Divisors —— 2017 Multi-University Training 4

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&#39;s problem(manacher+二分/枚举)