hdu6069



    #include<iostream>
    #include<queue>
    #include<cstring>
    #include<vector>
    #include<string>
    #include<algorithm>
    #include<cstdio>
    #include<cmath>
    #include<set>
    #include<cstdlib>
    #include<stack>
    typedef long long LL;
    const int maxsize = 1e6+7;
    using namespace std;
    int Ans[maxsize];
    LL D[maxsize];
    const int mood = 998244353;
    bool Prime[maxsize];
    LL PrimeT[maxsize];
    int pcnt;
    void primeFun(int n)//筛选法构造素数
    {
        pcnt = 0;
        Prime[0] = Prime[1] = 1;
        for(int i=2;i*i<=n+1;i++)
        {
            if(!Prime[i])
            {
                for(int j=i+i;j<=n;j+=i)
                {
                    Prime[j] = 1;
                }
            }
        }
        for(int i=0;i<=n;i++)
        {
            if(!Prime[i])
            {
                PrimeT[pcnt++] = i;
                //cout<<i<<" ";
            }
        }
    }


    int main()
    {
        //freopen("finput.txt","r",stdin);
        primeFun(1e6+1);
        int t;
        scanf("%d",&t);
        while(t--)
        {
            LL l,r,k;
            scanf("%lld%lld%lld",&l,&r,&k);
            LL n = r-l+1;
            fill(Ans,Ans+n,1);//赋值为1
            for(int i=0;i<n;i++)
            {
                D[i] = l+i;
            }
            for(int i=0;i<pcnt;i++)
            {
                LL primenow = PrimeT[i];
                LL t = l/primenow;
                if(l%primenow) t++;
                t *= primenow;
                for(LL j=t-l;j<n;j+=primenow)//算法的关键所在,应为是跳着取得,所以只有prime是这个数的因子的时候才进行操作
                {
                    int cnt = 0;
                    while(D[j]%primenow==0)
                    {
                        cnt++;
                        D[j]/=primenow;
                    }
                    Ans[j] = (Ans[j]*(cnt*k+1))%mood;
                }
            }
            LL sum = 0;
            for(int i=0;i<n;i++)
            {
                if(D[i]!=1)//对于大于10^6的整数进行特殊处理
                {
                    Ans[i] = (Ans[i]*(k+1))%mood;
                }
                //cout<<Ans[i]<<" ";
                sum = (sum+Ans[i])%mood;
            }
            printf("%lld\n",sum);
        }
        return 0;
    }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值