2017 Multi-University Training Contest

来源:互联网 发布:泪目什么意思网络词 编辑:程序博客网 时间:2024/05/16 06:12

http://acm.hdu.edu.cn/showproblem.php?pid=6069


题意:

  按题目描述需要求ri=ld(ik)mod 998244353,d(n)n的因子个数。

思路:

  设npc11pc22pcmm,则d(nk)=(kc1+1)(kc2+1)(kcm+1)
  枚举不超过r的所有质数p,再枚举区间[l,r]中所有p的倍数,将其分解质因数,最后剩下的不分就是超过r的质数,只可能是0个或1个。
  时间复杂度O(r+(rl+1)loglog(rl+1))

代码:

#include<bits/stdc++.h>using namespace std;#define ll long longconst ll N = 1000010;const ll MOD = 998244353;ll T,i,j,k,p[N / 10],tot,g[N],ans;ll n,lt,rt,f[N];bool v[N];void work(ll p){    for(ll i = lt / p * p;i <= rt;i += p){        if(i >= lt){            ll temp = 0;            while(f[i - lt] % p == 0){                f[i - lt] /= p;                temp++;            }            g[i - lt] = 1LL * g[i - lt] * (temp * k + 1) % MOD;        }    }}int main(){    for(i = 2;i < N;i++){        if(!v[i]){            p[tot++] = i;        }        for(j = 0; j < tot && i * p[j] < N;j++){            v[i * p[j]] = 1;            if(i % p[j] == 0){                break;            }        }    }    scanf("%lld",&T);    while(T--){        scanf("%lld %lld %lld",&lt,&rt,&k);        for(i = 0;i <= rt - lt;i++){            f[i] = i + lt;            g[i] = 1;        }        for(i = 0;i < tot;i++){            if(1LL * p[i] * p[i] > rt){                break;            }            work(p[i]);        }        ll ans = 0;        for(i = 0;i <= rt - lt;i++){            if(f[i] > 1){                g[i] = 1LL * g[i] * (k + 1) % MOD;            }            ans = (ans + g[i]) % MOD;        }        printf("%lld\n",ans);    }    return 0;}
原创粉丝点击