hdu 6069 Counting Divisors

/*
    1~1e6的  素数个数 约 等于 1e6/ lg1e6 =78498 ,
	直接对区间内每个数作因数 分析会超时, 
	那可以枚举 质因数,再类似于 筛法,累计每个数 当前的因数和 
*/ 
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int mod =998244353;
const int Size = 1e6+105;
int vis[Size],e[Size],cnt=0;
int ans[Size];
ll as[Size];
void prime()
{
	int q=1e6+3;
	 for(int i=2;i<q;i++)
	 if(!vis[i])
	 {
	   e[++cnt]=i;
	   for(int j=i+i;j<q; j += i) vis[j]=1;
     }
}
int main()
{
	memset(vis,0,sizeof(vis));
	prime();
    int k,t;
    scanf("%d",&t);
    ll l,r;
    while(t--)
     { 
	     scanf("%lld%lld%d",&l,&r,&k);
     	 for(int i=1;i<=r-l+1;i++) 
		    {
		    ans[i]=1;
		    as[i]=l-1+i;
	        }
     	    for(int i=1;i<=cnt&&e[i]<=r;i++)
     	     { 
     	     	ll x = l/e[i];
     	     	ll p = (ll)x*e[i];
     	     	if(p<l) 
				   {
				     p +=e[i];
				   }
     	     	for(;p<=r;p +=e[i])
     	     	 {
     	     	 	 ll nb=p;
     	     	 	 int xx=0;
     	     	 	 int pos=p-l+1;
     	     	 	 while(nb%e[i]==0)
     	     	 	  {
     	     	 	  	xx++;
     	     	 	  	nb /=e[i];
     	     	 	  	as[pos] /=e[i];
					  }
					  ll nn=ans[pos]; nn *=(xx*k+1)%mod; nn %=mod;
					  ans[pos] =nn;
				 }
         	} 
		ll ansans=0;
		for(int i=1;i<=r-l+1;i++) 
		{
		  if(as[i]!=1) 
		  {
		  	ll nn=(k+1); nn *=ans[i]; nn %=mod;
		  	ans[i] =nn;
		  }
		  ansans +=ans[i];
		  ansans %=mod;
	    }
	    printf("%lld\n",ansans);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值