QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#665582#9515. 无限地狱Nesraychan100 ✓3659ms136888kbC++143.4kb2024-10-22 14:11:092024-10-22 14:11:21

Judging History

你现在查看的是最新测评结果

  • [2024-10-22 14:11:21]
  • 评测
  • 测评结果:100
  • 用时:3659ms
  • 内存:136888kb
  • [2024-10-22 14:11:09]
  • 提交

answer

#include<bits/stdc++.h>
#define IL inline
#define reg register
#define N 2000200
#define mod 998244353
#define int long long
IL int Add(reg int x,reg int y){return x+y<mod?x+y:x+y-mod;}
IL int Sub(reg int x,reg int y){return x<y?x-y+mod:x-y;}
IL void Pls(reg int &x,reg int y){x=Add(x,y);}
IL void Dec(reg int &x,reg int y){x=Sub(x,y);}
IL int Mul(reg int x,reg int y){reg long long r=1ll*x*y; return r<mod?r:r%mod;}
IL int power(reg int x,reg int p){reg int r=1; for(;p;p>>=1,x=Mul(x,x))if(p&1)r=Mul(r,x); return r;}

int pri[N],mu[N],tot;
bool isp[N];

IL void sieve(reg int n)
{
    mu[1]=1;
    for(reg int i=2,j,v;i<=n;++i)
    {
        if(!isp[i])mu[pri[++tot]=i]=mod-1;
        for(j=1;j<=tot&&(v=i*pri[j])<=n;++j)
        {
            isp[v]=1;
            if(i%pri[j])mu[v]=Sub(0,mu[i]);
            else break;
        }
    }
}

const int B=2e6;
int n,w[N],id1[N],id2[N],cnt;

int F(reg int n);
int G(reg int n);
int H(reg int n);

bool visf[N],vish[N],visg[N];
int f[N],g[N],h[N];

IL int ID(reg int x){return x<=B?id1[x]:id2[n/x];}

bool vis1[N],vis2[N];
int s1[N],s2[N],pw[N];

IL int S1(reg int n)
{
    reg int id=ID(n);
    if(vis1[id])return s1[id];
    vis1[id]=1;
    if(n&1)s1[id]=Mul(2,Sub(power(2,n/2),1));
    else s1[id]=Add(power(2,n/2-1),Mul(2,Sub(power(2,n/2-1),1)));
    return s1[id]=Sub(s1[id],(n-1)%mod);
}

int smu[N],sf[N],sg[N],sh[N];

int S2(reg int n)
{
    if(n<=B)return smu[n];
    reg int id=ID(n);
    if(vis2[id])return s2[id];
    vis2[id]=1;
    reg int &ans=s2[id];
    ans=1;
    for(reg int l=2,r,d;l<=n;l=r+1)
        d=n/l,r=n/d,Dec(ans,Mul((r-l+1)%mod,S2(d)));
    return ans;
}

int F(reg int n)
{
    if(n<=B)return sf[n];
    reg int id=ID(n);
    if(visf[id])return f[id];
    visf[id]=1;
    reg int &ans=f[id];
    for(reg int l=2,r,d;l<=n;l=r+1)
        d=n/l,r=n/d,Pls(ans,Add(Mul(G(d),Sub(S1(r),S1(l-1))),Mul((r-l+1)%mod,H(d))));
    return ans;
}

int G(reg int n)
{
    if(n<=B)return sg[n];
    reg int id=ID(n);
    if(visg[id])return g[id];
    visg[id]=1;
    reg int &ans=g[id]; ans=Mul(2,H(n));
    Pls(ans,Add(Mul(2,F(n)),power(2,n)-1));
    return ans;
}

int H(reg int n)
{
    if(n<=B)return sh[n];
    reg int id=ID(n);
    if(vish[id])return h[id];
    vish[id]=1;
    reg int &ans=h[id];
    for(reg int l=1,r,d;l<=n;l=r+1)
    {
        d=n/l,r=n/d;
        Pls(ans,Mul(Sub(S2(r),S2(l-1)),Sub(Mul(3,Add(F(d),pw[ID(d)])),2)));
    }
    Dec(ans,Add(Mul(2,F(n)),power(2,n)-1));
    return ans;
}

int pw2[N];

main()
{
    scanf("%lld",&n),sieve(B),pw2[0]=1;
    for(reg int i=1;i<=B;++i)pw2[i]=Mul(pw2[i-1],2);
    for(reg int d=1,t;d<=B;++d)
    {
        if(d!=1)for(t=1;d*t<=B;++t)
        {
            Pls(sg[d*t],Mul(Mul(6,mu[t]),Add(sf[d],pw2[d-2])));
            Pls(sh[d*t],Mul(Mul(3,mu[t]),Add(sf[d],pw2[d-2])));
        }
        Pls(sg[d],Sub(Mul(2,mu[d]),Add(Mul(2,sf[d]),pw2[d-1])));
        Pls(sh[d],Sub(mu[d],Add(Mul(2,sf[d]),pw2[d-1])));
        for(t=2;d*t<=B;++t)Pls(sf[d*t],Add(Mul(pw2[t/2-1]-1,sg[d]),sh[d]));
    }
    for(reg int i=1;i<=B;++i)
        Pls(sf[i],sf[i-1]),
        Pls(sg[i],sg[i-1]),
        Pls(sh[i],sh[i-1]),
        smu[i]=Add(mu[i],smu[i-1]);
    for(reg int l=1,r,x;l<=n;l=r+1)
    {
        x=n/l,r=n/x,w[++cnt]=x;
        if(x<=B)id1[x]=cnt;
        else id2[n/x]=cnt;
        pw[cnt]=power(2,x-1);
    }
    printf("%lld\n",Add(F(n),power(2,n-1)));
}

詳細信息

Subtask #1:

score: 4
Accepted

Test #1:

score: 4
Accepted
time: 884ms
memory: 107196kb

input:

6

output:

38

result:

ok 1 number(s): "38"

Test #2:

score: 4
Accepted
time: 860ms
memory: 108248kb

input:

7

output:

73

result:

ok 1 number(s): "73"

Test #3:

score: 4
Accepted
time: 861ms
memory: 106724kb

input:

8

output:

148

result:

ok 1 number(s): "148"

Test #4:

score: 4
Accepted
time: 844ms
memory: 107280kb

input:

9

output:

284

result:

ok 1 number(s): "284"

Test #5:

score: 4
Accepted
time: 853ms
memory: 108280kb

input:

10

output:

565

result:

ok 1 number(s): "565"

Subtask #2:

score: 13
Accepted

Dependency #1:

100%
Accepted

Test #6:

score: 13
Accepted
time: 865ms
memory: 108004kb

input:

30

output:

536938322

result:

ok 1 number(s): "536938322"

Test #7:

score: 13
Accepted
time: 888ms
memory: 108292kb

input:

35

output:

210046687

result:

ok 1 number(s): "210046687"

Test #8:

score: 13
Accepted
time: 856ms
memory: 107868kb

input:

38

output:

680532913

result:

ok 1 number(s): "680532913"

Test #9:

score: 13
Accepted
time: 832ms
memory: 107064kb

input:

39

output:

362030079

result:

ok 1 number(s): "362030079"

Test #10:

score: 13
Accepted
time: 841ms
memory: 107416kb

input:

40

output:

723529503

result:

ok 1 number(s): "723529503"

Subtask #3:

score: 17
Accepted

Dependency #2:

100%
Accepted

Test #11:

score: 17
Accepted
time: 858ms
memory: 107156kb

input:

2000

output:

686289840

result:

ok 1 number(s): "686289840"

Test #12:

score: 17
Accepted
time: 912ms
memory: 107532kb

input:

2500

output:

672176744

result:

ok 1 number(s): "672176744"

Test #13:

score: 17
Accepted
time: 979ms
memory: 108240kb

input:

2998

output:

77001108

result:

ok 1 number(s): "77001108"

Test #14:

score: 17
Accepted
time: 934ms
memory: 106720kb

input:

2999

output:

337824775

result:

ok 1 number(s): "337824775"

Test #15:

score: 17
Accepted
time: 930ms
memory: 107284kb

input:

3000

output:

636156660

result:

ok 1 number(s): "636156660"

Subtask #4:

score: 21
Accepted

Dependency #3:

100%
Accepted

Test #16:

score: 21
Accepted
time: 928ms
memory: 107880kb

input:

100000

output:

809175948

result:

ok 1 number(s): "809175948"

Test #17:

score: 21
Accepted
time: 889ms
memory: 110508kb

input:

200000

output:

425311829

result:

ok 1 number(s): "425311829"

Test #18:

score: 21
Accepted
time: 930ms
memory: 110728kb

input:

500000

output:

302623178

result:

ok 1 number(s): "302623178"

Test #19:

score: 21
Accepted
time: 926ms
memory: 114040kb

input:

900000

output:

683174559

result:

ok 1 number(s): "683174559"

Test #20:

score: 21
Accepted
time: 960ms
memory: 114368kb

input:

1000000

output:

126560600

result:

ok 1 number(s): "126560600"

Subtask #5:

score: 22
Accepted

Dependency #4:

100%
Accepted

Test #21:

score: 22
Accepted
time: 964ms
memory: 124500kb

input:

100000000

output:

269652149

result:

ok 1 number(s): "269652149"

Test #22:

score: 22
Accepted
time: 1059ms
memory: 128896kb

input:

300000000

output:

421051808

result:

ok 1 number(s): "421051808"

Test #23:

score: 22
Accepted
time: 1093ms
memory: 130448kb

input:

700000000

output:

834273337

result:

ok 1 number(s): "834273337"

Test #24:

score: 22
Accepted
time: 1113ms
memory: 129120kb

input:

990000000

output:

848544380

result:

ok 1 number(s): "848544380"

Test #25:

score: 22
Accepted
time: 1090ms
memory: 132136kb

input:

1000000000

output:

341773916

result:

ok 1 number(s): "341773916"

Subtask #6:

score: 23
Accepted

Dependency #5:

100%
Accepted

Test #26:

score: 23
Accepted
time: 2523ms
memory: 136632kb

input:

12000000000

output:

877921487

result:

ok 1 number(s): "877921487"

Test #27:

score: 23
Accepted
time: 3224ms
memory: 131736kb

input:

17000000000

output:

691116504

result:

ok 1 number(s): "691116504"

Test #28:

score: 23
Accepted
time: 3563ms
memory: 134496kb

input:

19900000000

output:

87007717

result:

ok 1 number(s): "87007717"

Test #29:

score: 23
Accepted
time: 3659ms
memory: 135252kb

input:

19990000000

output:

455948458

result:

ok 1 number(s): "455948458"

Test #30:

score: 23
Accepted
time: 3491ms
memory: 136888kb

input:

20000000000

output:

128153394

result:

ok 1 number(s): "128153394"