QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#891873 | #10078. FS's Critical Concert | 致远星 (Penghao Zhai, Qiwen Xu, Xubei Zhong)# | AC ✓ | 3424ms | 131552kb | C++23 | 3.4kb | 2025-02-09 18:58:53 | 2025-02-09 18:58:57 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
namespace Polynomial
{
using ll=long long;
using poly=vector<ll>;
const ll mod=998244353;
ll ksm(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1) ans=ans*a%mod;
b>>=1;
a=a*a%mod;
}
return ans;
}
inline int sz(const poly &p)
{
return p.size();
}
const poly operator +(const poly &a,const poly &b)
{
int p=sz(a),q=sz(b);
int n=max(p,q);
poly ret(n,0);
for(int i=0;i<n;i++)
{
if(i<p) ret[i]+=a[i];
if(i<q) ret[i]+=b[i];
if(ret[i]>=mod) ret[i]-=mod;
}
return ret;
}
const poly operator -(const poly &a,const poly &b)
{
int p=sz(a),q=sz(b);
int n=max(p,q);
poly ret(n,0);
for(int i=0;i<n;i++)
{
if(i<p) ret[i]+=a[i];
if(i<q) ret[i]+=mod-b[i];
if(ret[i]>=mod) ret[i]-=mod;
}
return ret;
}
poly operator *(poly a,poly b)
{
const ll g=3;
int len=sz(a)+sz(b);
int m=1;
while(m<sz(a)+sz(b)) m*=2;
a.resize(m);
b.resize(m);
vector<int> rev(m);
for(int i=0;i<m;i++)
rev[i]=(rev[i>>1]>>1)|((i&1)*(m>>1));
for(int i=0;i<m;i++)
if(rev[i]<i)
{
swap(a[i],a[rev[i]]);
swap(b[i],b[rev[i]]);
}
for(int i=1;i<m;i<<=1)
{
ll gn=ksm(g,(mod-1)/i/2);
for(int j=0;j<m;j+=(i<<1))
{
ll g0=1;
for(int k=0;k<i;k++,g0=g0*gn%mod)
{
{
ll x=a[j+k],y=g0*a[i+j+k]%mod;
a[j+k]=(x+y)%mod;
a[i+j+k]=(x+mod-y)%mod;
}
{
ll x=b[j+k],y=g0*b[i+j+k]%mod;
b[j+k]=(x+y)%mod;
b[i+j+k]=(x+mod-y)%mod;
}
}
}
}
for(int i=0;i<m;i++)
a[i]=a[i]*b[i]%mod;
for(int i=0;i<m;i++)
if(rev[i]<i)
swap(a[i],a[rev[i]]);
for(int i=1;i<m;i<<=1)
{
ll gn=ksm(g,(mod-1)/i/2*(mod-2));
for(int j=0;j<m;j+=(i<<1))
{
ll g0=1;
for(int k=0;k<i;k++,g0=g0*gn%mod)
{
ll x=a[j+k],y=g0*a[i+j+k]%mod;
a[j+k]=(x+y)%mod;
a[i+j+k]=(x+mod-y)%mod;
}
}
}
ll val=ksm(m,mod-2);
for(int i=0;i<m;i++)
a[i]=a[i]*val%mod;
a.resize(len-1);
return a;
}
poly inv(poly p,int deg)
{
p.resize(deg);
if(deg==1) return {ksm(p[0],mod-2)};
poly w=inv(p,(deg+1)/2);
poly g=w+w-p*w*w;
g.resize(deg);
return g;
}
poly deriv(poly p)
{
for(int i=0;i<sz(p);i++)
p[i]=p[i]*i%mod;
p.erase(p.begin());
return p;
}
poly integ(poly p)
{
p.insert(p.begin(),0);
for(int i=0;i<sz(p);i++)
p[i]=p[i]*ksm(i,mod-2)%mod;
return p;
}
poly ln(poly p)
{
return integ(deriv(p)*inv(p,sz(p)));
}
poly exp(poly p,int deg)
{
p.resize(deg);
if(deg==1)
return {1};
poly g=exp(p,(deg+1)/2);
g=g*(poly{1}-ln(g)+p);
g.resize(deg);
return g;
}
}
using namespace Polynomial;
ll fact[1000500],rfact[1000500];
ll val[1000500];
int main()
{
int n;
cin>>n;
n*=2;
fact[0]=1;
for(int i=1;i<=n;i++)
fact[i]=fact[i-1]*i%mod;
for(int i=0;i<=n;i++) rfact[i]=ksm(fact[i],mod-2);
poly f(n+1);
for(int i=0;i<=n;i++)
f[i]=ksm(2,1ll*i*(i-1)/2)*ksm(fact[i],mod-2)%mod;
f=ln(f);
for(int i=1;i<=n;i++)
val[i]=f[i]*fact[i]%mod;
poly A(n+1);
for(int i=1;i<=n;i++)
A[i]=val[i]*i%mod*rfact[i]%mod;
A=A*A;
ll ans=0;
n/=2;
for(int i=1;i<=n;i++)
{
ll C=fact[n]*rfact[i]%mod*rfact[n-i]%mod;
C=C*ksm(2,1ll*(n-i)*(n-i-1)/2)%mod;
ans=(ans+A[i]*fact[i]%mod*C)%mod;
}
cout<<ans*ksm(2,mod-2)%mod<<'\n';
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 7756kb
input:
3
output:
9
result:
ok 1 number(s): "9"
Test #2:
score: 0
Accepted
time: 0ms
memory: 7708kb
input:
8
output:
130981312
result:
ok 1 number(s): "130981312"
Test #3:
score: 0
Accepted
time: 1ms
memory: 7760kb
input:
1
output:
0
result:
ok 1 number(s): "0"
Test #4:
score: 0
Accepted
time: 0ms
memory: 7756kb
input:
2
output:
1
result:
ok 1 number(s): "1"
Test #5:
score: 0
Accepted
time: 0ms
memory: 7752kb
input:
4
output:
96
result:
ok 1 number(s): "96"
Test #6:
score: 0
Accepted
time: 0ms
memory: 7760kb
input:
5
output:
1500
result:
ok 1 number(s): "1500"
Test #7:
score: 0
Accepted
time: 0ms
memory: 7756kb
input:
6
output:
37560
result:
ok 1 number(s): "37560"
Test #8:
score: 0
Accepted
time: 0ms
memory: 7760kb
input:
7
output:
1626912
result:
ok 1 number(s): "1626912"
Test #9:
score: 0
Accepted
time: 1ms
memory: 7880kb
input:
9
output:
591945260
result:
ok 1 number(s): "591945260"
Test #10:
score: 0
Accepted
time: 0ms
memory: 7760kb
input:
10
output:
877137661
result:
ok 1 number(s): "877137661"
Test #11:
score: 0
Accepted
time: 0ms
memory: 7880kb
input:
11
output:
654711510
result:
ok 1 number(s): "654711510"
Test #12:
score: 0
Accepted
time: 0ms
memory: 7752kb
input:
12
output:
896890421
result:
ok 1 number(s): "896890421"
Test #13:
score: 0
Accepted
time: 0ms
memory: 7756kb
input:
13
output:
544152239
result:
ok 1 number(s): "544152239"
Test #14:
score: 0
Accepted
time: 0ms
memory: 7760kb
input:
14
output:
203161729
result:
ok 1 number(s): "203161729"
Test #15:
score: 0
Accepted
time: 0ms
memory: 7760kb
input:
15
output:
686403302
result:
ok 1 number(s): "686403302"
Test #16:
score: 0
Accepted
time: 0ms
memory: 7756kb
input:
16
output:
551788068
result:
ok 1 number(s): "551788068"
Test #17:
score: 0
Accepted
time: 1ms
memory: 7756kb
input:
17
output:
778761614
result:
ok 1 number(s): "778761614"
Test #18:
score: 0
Accepted
time: 1ms
memory: 7760kb
input:
18
output:
372704747
result:
ok 1 number(s): "372704747"
Test #19:
score: 0
Accepted
time: 0ms
memory: 7760kb
input:
19
output:
48091879
result:
ok 1 number(s): "48091879"
Test #20:
score: 0
Accepted
time: 1ms
memory: 7752kb
input:
20
output:
811962966
result:
ok 1 number(s): "811962966"
Test #21:
score: 0
Accepted
time: 0ms
memory: 7708kb
input:
21
output:
580925653
result:
ok 1 number(s): "580925653"
Test #22:
score: 0
Accepted
time: 0ms
memory: 7752kb
input:
22
output:
473369147
result:
ok 1 number(s): "473369147"
Test #23:
score: 0
Accepted
time: 0ms
memory: 7756kb
input:
23
output:
370850086
result:
ok 1 number(s): "370850086"
Test #24:
score: 0
Accepted
time: 0ms
memory: 7756kb
input:
24
output:
633052748
result:
ok 1 number(s): "633052748"
Test #25:
score: 0
Accepted
time: 0ms
memory: 7760kb
input:
25
output:
760181773
result:
ok 1 number(s): "760181773"
Test #26:
score: 0
Accepted
time: 0ms
memory: 7760kb
input:
26
output:
618049730
result:
ok 1 number(s): "618049730"
Test #27:
score: 0
Accepted
time: 0ms
memory: 7752kb
input:
27
output:
197289938
result:
ok 1 number(s): "197289938"
Test #28:
score: 0
Accepted
time: 0ms
memory: 7760kb
input:
28
output:
708240707
result:
ok 1 number(s): "708240707"
Test #29:
score: 0
Accepted
time: 0ms
memory: 7720kb
input:
29
output:
726463024
result:
ok 1 number(s): "726463024"
Test #30:
score: 0
Accepted
time: 0ms
memory: 7756kb
input:
30
output:
587550457
result:
ok 1 number(s): "587550457"
Test #31:
score: 0
Accepted
time: 0ms
memory: 7760kb
input:
100
output:
721970458
result:
ok 1 number(s): "721970458"
Test #32:
score: 0
Accepted
time: 10ms
memory: 8136kb
input:
2562
output:
947609016
result:
ok 1 number(s): "947609016"
Test #33:
score: 0
Accepted
time: 13ms
memory: 8392kb
input:
3410
output:
462244613
result:
ok 1 number(s): "462244613"
Test #34:
score: 0
Accepted
time: 29ms
memory: 9176kb
input:
5712
output:
225049703
result:
ok 1 number(s): "225049703"
Test #35:
score: 0
Accepted
time: 49ms
memory: 10128kb
input:
10002
output:
577290168
result:
ok 1 number(s): "577290168"
Test #36:
score: 0
Accepted
time: 301ms
memory: 24188kb
input:
50012
output:
513616100
result:
ok 1 number(s): "513616100"
Test #37:
score: 0
Accepted
time: 508ms
memory: 27952kb
input:
75162
output:
197336463
result:
ok 1 number(s): "197336463"
Test #38:
score: 0
Accepted
time: 728ms
memory: 38128kb
input:
129257
output:
307374532
result:
ok 1 number(s): "307374532"
Test #39:
score: 0
Accepted
time: 1514ms
memory: 61596kb
input:
202572
output:
342782823
result:
ok 1 number(s): "342782823"
Test #40:
score: 0
Accepted
time: 2465ms
memory: 104756kb
input:
348252
output:
992752188
result:
ok 1 number(s): "992752188"
Test #41:
score: 0
Accepted
time: 3410ms
memory: 126024kb
input:
452632
output:
374752381
result:
ok 1 number(s): "374752381"
Test #42:
score: 0
Accepted
time: 3424ms
memory: 131552kb
input:
500000
output:
553811795
result:
ok 1 number(s): "553811795"