hdu 6069 Counting Divisors

来源:互联网 发布:js只执行一次方法 编辑:程序博客网 时间:2024/06/05 06:29
/*    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;}

原创粉丝点击