hdu 6069 Counting Divisors

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<cmath>
#include<set>
#include<stack>
#define ll long long
#define pb push_back
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x))
#define cls(name,x) memset(name,x,sizeof(name))//0或-1
#define fs first
#define sc second
#define mp make_pair
#define L(x) (1<<x)
#define next Next
using namespace std;
const int inf=1e9+10;
const ll llinf=1e18+10;
const int maxn=1e6+10;
const int maxm=2e5+10;
const int mod=998244353;
//const int mod=1e9+7;
ll n,k;
ll l,r;
ll fac[maxn];
ll A[maxn],B[maxn];
void init()
{
    int t=0;
    bool prime[maxn];
    cls(prime,0);
    for(int i=2;i<maxn;i++)
    {
        if(prime[i]==0)
        {
            fac[t++]=i;
            for(int j=2;j*i<maxn;j++)
                prime[i*j]=1;
        }
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("wa.txt","w",stdout);
    init();
    int ncas;
    scanf("%d",&ncas);
    while(ncas--)
    {
        scanf("%lld %lld %lld",&l,&r,&k);
        for(ll i=l;i<=r;i++)
        {
            A[i-l]=1;
            B[i-l]=i;
        }
        for(int i=0;fac[i]*fac[i]<=r;i++)
            for(ll j=l/fac[i]+(l%fac[i]!=0);j*fac[i]<=r;j++)
            {
                ll c=0;
                while(B[fac[i]*j-l]%fac[i]==0)
                {
                    B[fac[i]*j-l]/=fac[i];
                    c++;
                }
                A[fac[i]*j-l]=( A[fac[i]*j-l] * ( c*k+1) )%mod;
            }
        ll ans=0;
        for(ll i=l;i<=r;i++)
        {
            if(B[i-l]>1) A[i-l]=(A[i-l]*(k+1))%mod;
            ans=(ans+A[i-l])%mod;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

 

posted @ 2017-08-04 16:24  爱种树的码农  阅读(115)  评论(0编辑  收藏  举报