QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#665582 | #9515. 无限地狱 | Nesraychan | 100 ✓ | 3659ms | 136888kb | C++14 | 3.4kb | 2024-10-22 14:11:09 | 2024-10-22 14:11:21 |
Judging History
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)));
}
Details
Tip: Click on the bar to expand more detailed information
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"