gdfzoj #987 约数统计(线性筛+思维)

来源:互联网 发布:美帝国主义 知乎 编辑:程序博客网 时间:2024/05/29 07:38

标签:线性筛
这里写图片描述


这里写图片描述
这里写图片描述
P.S.:100分的做法时间复杂度证明类似于调和级数。。。

#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#define mod 998244353using namespace std;typedef long long ll;bool f[1000050];ll p[100050],top=0ll,ans[1000050],t[1000050],hz=0ll,l,r,k,n,zzk,tmp;int main(){    scanf("%lld%lld%lld",&l,&r,&k);    f[0]=f[1]=1,p[0]=0,n=floor(sqrt(r));    for (int i=2;i<=n;i++)    {        if (!f[i]) p[++top]=i;        for (int j=1;j<=top&&i*p[j]<=n;j++)        {            f[i*p[j]]=1;            if (i%p[j]==0) break;        }    }    for (ll j=l;j<=r;j++) ans[j-l]=1,t[j-l]=j;;    for (int i=1;i<=top;i++)     {        tmp=(l/p[i])*p[i];        if (tmp<l) tmp+=p[i];        for (ll j=tmp;j<=r;j+=p[i])        {            zzk=0ll;            while (t[j-l]%p[i]==0)                 t[j-l]/=p[i],zzk++;            ans[j-l]=(ans[j-l]*(zzk*k+1))%mod;        }    }    for (ll j=l;j<=r;j++) if (t[j-l]!=1) ans[j-l]=(ans[j-l]*(k+1))%mod;    for (ll j=l;j<=r;j++) hz=(hz+ans[j-l])%mod;    printf("%lld",hz);}