HDU6069---Counting Divisors(2017多校联赛:数学)

来源:互联网 发布:淘宝打假部门联系方式 编辑:程序博客网 时间:2024/06/06 12:31

【题目来源】:http://acm.hdu.edu.cn/showproblem.php?pid=6069;
【题意】
求所示式子的答案。
【思路】
这道题对于我挺绕的,当时比赛的时候想了一二十分钟,想了出来,但是实现的时候由于代码水平有限,以至于今天打了一遍过了,依旧找不出昨天的错误,思路基本和题解一致,用到了几个数论小知识,比如:求一个数的所有因子的数目可以通过素数的次幂进行相乘求解,然后就是一个模拟了。
【代码】

//先统计素因子数目,记录,最后相加。#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int maxn=1e6+10;const int mod=998244353;LL prime[maxn];bool check[maxn];LL p[maxn],q[maxn];LL l,r,k;int tot;void pri(){    check[1]=1;    for(int i=2; i<maxn; i++)    {        if(!check[i])prime[tot++]=i;        for(int j=0; j<tot&&i*prime[j]<maxn; j++)        {            check[i*prime[j]]=1;            if(i%prime[j]==0)break;        }    }}int main(){    int T;    tot=0;    pri();    scanf("%d",&T);    while(T--)    {        scanf("%lld%lld%lld",&l,&r,&k);        for(int i=0;i<=r-l;i++)        {            p[i]=l+i;            q[i]=1;        }        for(int i=0; i<tot; i++)        {            if(prime[i]*prime[i]>r) break;            LL L=l/prime[i];            LL j=prime[i]*(L+(l%prime[i]!=0));            for(;j<=r;j+=prime[i])            {                int tmp=0;                while(p[j-l]%prime[i]==0)                {                    tmp++;                    p[j-l]/=prime[i];                }                q[j-l]*=(k*tmp+1);                q[j-l]%=mod;            }        }        LL sum=0;        for(LL i=l; i<=r; i++)        {            if(p[i-l]!=1)            {                q[i-l]*=(k+1);                if(q[i-l]>=mod)                    q[i-l]%=mod;            }            sum+=q[i-l];            if(sum>=mod)                sum%=mod;        }        printf("%lld\n",sum);    }}
原创粉丝点击