QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#670114 | #9515. 无限地狱 | zhouhuanyi | 100 ✓ | 2316ms | 107692kb | C++17 | 2.9kb | 2024-10-23 20:31:46 | 2024-10-23 20:31:47 |
Judging History
answer
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#define N 3000000
#define M 400000
#define mod 998244353
using namespace std;
long long read()
{
char c=0;
long long sum=0;
while (c<'0'||c>'9') c=getchar();
while ('0'<=c&&c<='9') sum=sum*10+c-'0',c=getchar();
return sum;
}
int MD(int x)
{
return x>=mod?x-mod:x;
}
int MD2(int x)
{
return x<0?x+mod:x;
}
void Adder(int &x,int d)
{
x=x+d>=mod?x+d-mod:x+d;
return;
}
void Adder2(int &x,int d)
{
x=x+d<0?x+d+mod:x+d;
return;
}
long long n,tong[M+1];
int length,sn,dp[N+1],DP[N+1],zdp[N+1],zDP[N+1],pw[N+1],pw2[N+1],miu[N+1],smiu[N+1],wdp[M+1],wDP[M+1],tmiu[M+1];
bool nprime[N+1];
int get_pow(long long x)
{
return 1ll*pw[(x-1)%N+1]*pw2[(x-1)/N]%mod;
}
int S(long long x)
{
if (x&1) return MD2(get_pow((x>>1)+1)-(x+1)%mod);
else return MD2(3ll*get_pow((x>>1)-1)%mod-(x+1)%mod);
}
int get(long long x)
{
if (x<=sn) return x;
else return length-n/x+1;
}
int main()
{
n=read();
while (1ll*(sn+1)*(sn+1)<=n) ++sn;
for (long long i=1,lst;i<=n;i=lst+1) lst=n/(n/i),tong[++length]=n/i;
reverse(tong+1,tong+length+1);
for (int i=1;i<=N;++i) miu[i]=1;
for (int i=2;i<=N;++i)
if (!nprime[i])
{
miu[i]=-1;
for (int j=(i<<1);j<=N;j+=i)
{
miu[j]=-miu[j],nprime[j]=1;
if ((j/i)%i==0) miu[j]=0;
}
}
pw[0]=pw2[0]=1;
for (int i=1;i<=N;++i) smiu[i]=MD2(smiu[i-1]+miu[i]),pw[i]=2ll*pw[i-1]%mod;
for (int i=1;i<=N;++i) pw2[i]=1ll*pw2[i-1]*pw[N]%mod;
for (int i=1;i<=N;++i)
{
Adder(zdp[i],zdp[i-1]),Adder(zDP[i],zDP[i-1]),Adder(dp[i],zdp[i]),Adder(DP[i],zDP[i]),Adder(dp[i],pw[i-1]),Adder(DP[i],MD2(dp[i]-1));
for (int j=2;j<=N/i;++j)
{
Adder(zdp[i*j],DP[i]),Adder(zdp[i*j],1ll*MD2(pw[(j>>1)-1]-1)*MD2(2ll*MD(dp[i]+DP[i])%mod-1)%mod);
if (miu[j]==1) Adder(zDP[i*j],MD2(3ll*dp[i]%mod-2));
else if (miu[j]==-1) Adder2(zDP[i*j],-MD2(3ll*dp[i]%mod-2));
if ((i+1)*j<=N)
{
Adder2(zdp[(i+1)*j],-DP[i]),Adder2(zdp[(i+1)*j],-1ll*MD2(pw[(j>>1)-1]-1)*MD2(2ll*MD(dp[i]+DP[i])%mod-1)%mod);
if (miu[j]==1) Adder2(zDP[(i+1)*j],-MD2(3ll*dp[i]%mod-2));
else if (miu[j]==-1) Adder(zDP[(i+1)*j],MD2(3ll*dp[i]%mod-2));
}
}
}
for (int i=1;i<=length;++i)
{
if (tong[i]<=N) wdp[i]=dp[tong[i]],wDP[i]=DP[tong[i]],tmiu[i]=smiu[tong[i]];
else
{
wdp[i]=get_pow(tong[i]-1),tmiu[i]=1;
for (long long j=2,lst;j<=tong[i];j=lst+1)
{
lst=tong[i]/(tong[i]/j);
Adder2(tmiu[i],-1ll*((lst-j+1)%mod)*tmiu[get(tong[i]/j)]%mod);
Adder(wdp[i],1ll*((lst-j+1)%mod)*wDP[get(tong[i]/j)]%mod);
Adder(wdp[i],1ll*MD2(S(lst)-S(j-1))%mod*MD2(2ll*MD(wdp[get(tong[i]/j)]+wDP[get(tong[i]/j)])%mod-1)%mod);
Adder(wDP[i],1ll*MD2(tmiu[get(lst)]-tmiu[get(j-1)])%mod*MD2(3ll*wdp[get(tong[i]/j)]%mod-2)%mod);
}
Adder(wDP[i],MD2(wdp[i]-1));
}
}
printf("%d\n",wdp[length]);
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 4
Accepted
Test #1:
score: 4
Accepted
time: 1191ms
memory: 103180kb
input:
6
output:
38
result:
ok 1 number(s): "38"
Test #2:
score: 4
Accepted
time: 1114ms
memory: 103496kb
input:
7
output:
73
result:
ok 1 number(s): "73"
Test #3:
score: 4
Accepted
time: 1031ms
memory: 103324kb
input:
8
output:
148
result:
ok 1 number(s): "148"
Test #4:
score: 4
Accepted
time: 1087ms
memory: 104516kb
input:
9
output:
284
result:
ok 1 number(s): "284"
Test #5:
score: 4
Accepted
time: 1009ms
memory: 103580kb
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: 1041ms
memory: 103560kb
input:
30
output:
536938322
result:
ok 1 number(s): "536938322"
Test #7:
score: 13
Accepted
time: 1045ms
memory: 103384kb
input:
35
output:
210046687
result:
ok 1 number(s): "210046687"
Test #8:
score: 13
Accepted
time: 1046ms
memory: 103856kb
input:
38
output:
680532913
result:
ok 1 number(s): "680532913"
Test #9:
score: 13
Accepted
time: 1036ms
memory: 105096kb
input:
39
output:
362030079
result:
ok 1 number(s): "362030079"
Test #10:
score: 13
Accepted
time: 1078ms
memory: 104868kb
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: 1079ms
memory: 104528kb
input:
2000
output:
686289840
result:
ok 1 number(s): "686289840"
Test #12:
score: 17
Accepted
time: 1087ms
memory: 104608kb
input:
2500
output:
672176744
result:
ok 1 number(s): "672176744"
Test #13:
score: 17
Accepted
time: 1088ms
memory: 104792kb
input:
2998
output:
77001108
result:
ok 1 number(s): "77001108"
Test #14:
score: 17
Accepted
time: 1039ms
memory: 103380kb
input:
2999
output:
337824775
result:
ok 1 number(s): "337824775"
Test #15:
score: 17
Accepted
time: 1002ms
memory: 104592kb
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: 1016ms
memory: 103944kb
input:
100000
output:
809175948
result:
ok 1 number(s): "809175948"
Test #17:
score: 21
Accepted
time: 918ms
memory: 103248kb
input:
200000
output:
425311829
result:
ok 1 number(s): "425311829"
Test #18:
score: 21
Accepted
time: 937ms
memory: 104904kb
input:
500000
output:
302623178
result:
ok 1 number(s): "302623178"
Test #19:
score: 21
Accepted
time: 961ms
memory: 105184kb
input:
900000
output:
683174559
result:
ok 1 number(s): "683174559"
Test #20:
score: 21
Accepted
time: 923ms
memory: 103648kb
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: 926ms
memory: 104368kb
input:
100000000
output:
269652149
result:
ok 1 number(s): "269652149"
Test #22:
score: 22
Accepted
time: 952ms
memory: 104520kb
input:
300000000
output:
421051808
result:
ok 1 number(s): "421051808"
Test #23:
score: 22
Accepted
time: 996ms
memory: 107300kb
input:
700000000
output:
834273337
result:
ok 1 number(s): "834273337"
Test #24:
score: 22
Accepted
time: 1017ms
memory: 107216kb
input:
990000000
output:
848544380
result:
ok 1 number(s): "848544380"
Test #25:
score: 22
Accepted
time: 1092ms
memory: 107692kb
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: 1864ms
memory: 106972kb
input:
12000000000
output:
877921487
result:
ok 1 number(s): "877921487"
Test #27:
score: 23
Accepted
time: 2213ms
memory: 107208kb
input:
17000000000
output:
691116504
result:
ok 1 number(s): "691116504"
Test #28:
score: 23
Accepted
time: 2316ms
memory: 106840kb
input:
19900000000
output:
87007717
result:
ok 1 number(s): "87007717"
Test #29:
score: 23
Accepted
time: 2286ms
memory: 107076kb
input:
19990000000
output:
455948458
result:
ok 1 number(s): "455948458"
Test #30:
score: 23
Accepted
time: 2297ms
memory: 106920kb
input:
20000000000
output:
128153394
result:
ok 1 number(s): "128153394"