QOJ.ac
QOJ
QOJ is currently under a maintenance. It might be unavailable in the following a few hours.
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#896938 | #10078. FS's Critical Concert | liuhengxi | AC ✓ | 645ms | 70696kb | C++14 | 3.7kb | 2025-02-13 16:15:50 | 2025-02-13 16:15:51 |
Judging History
answer
// created: 2025-02-13 15:48:08
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#include<vector>
#define F(i,l,r) for(int i=(l),i##_end=(r);i<i##_end;++i)
#define I128 //||is_same<T,__int128_t>::value||is_same<T,__uint128_t>::value
using namespace std;
template<typename T>enable_if_t<is_integral<T>::value I128,void> readmain(T &x)
{
bool neg=false;int c=getchar();
for(;!isdigit(c);c=getchar())if(c=='-')neg=true;
for(x=0;isdigit(c);c=getchar())x=(T)(10*x+(c-'0'));
if(neg)x=-x;
}
template<typename T>T& read(T &x){readmain(x);return x;}
template<typename T,typename ...Tr>void read(T &x,Tr&... r){readmain(x);read(r...);}
typedef unsigned long long ull;
constexpr int N=(1<<21)+5,MOD=998244353,inv2=(MOD+1)>>1;
void reduce(int &x){if(x>=MOD)x-=MOD;}
int qpow(ull a,int b,ull c=1)
{
for(;b;b>>=1,(a*=a)%=MOD)if(b&1)(c*=a)%=MOD;
return (int)c;
}
namespace conv
{
int r[N],g[N];
ull a[N];
void ntt(int *b,int n,bool inv)
{
int m=31^__builtin_clz(n);
F(i,0,n)r[i]=r[i>>1]>>1|(i&1)<<(m-1),a[i]=b[r[i]];
F(i,0,m)
{
int h=1<<i,s=2<<i,g_=qpow(3,(MOD-1)>>(i+1));
F(j,g[0]=1,h)g[j]=(int)((ull)g[j-1]*g_%MOD);
for(int l=0;l<n;l+=s)
{
ull *u=a+l,*v=a+l+h,x;
for(int k=0;k<h;++k,++u,++v)
{
x=*v*g[k]%MOD;
*v=*u+MOD-x;
*u+=x;
}
}
if(i==14)F(j,0,h)a[j]%=MOD;
}
if(inv)
{
ull invn=MOD-((MOD-1)>>m);
reverse(a+1,a+n);
F(i,0,n)a[i]*=invn;
}
F(i,0,n)b[i]=(int)(a[i]%MOD);
}
int getn(int n){return 1<<(32-__builtin_clz((n-1)|1));}
void ntt(vector<int> &x,int n,bool inv)
{
x.resize(n);
ntt(x.data(),n,inv);
}
vector<int> conv(vector<int> x,vector<int> y)
{
static int c[N],d[N];
int n=1<<(32-__builtin_clz(((int)(x.size()+y.size()-2)|1)));
memset(c,0,sizeof(int)*n);
memset(d,0,sizeof(int)*n);
memcpy(c,x.data(),sizeof(int)*x.size());
memcpy(d,y.data(),sizeof(int)*y.size());
if(n<=32)
{
static ull e[32];
F(i,0,n)e[i]=0;
F(i,0,(int)x.size())F(j,0,(int)y.size())e[i+j]+=(ull)c[i]*d[j];
F(i,0,n)c[i]=(int)(e[i]%MOD);
}
else
{
ntt(c,n,false);
ntt(d,n,false);
F(i,0,n)c[i]=(int)((ull)c[i]*d[i]%MOD);
ntt(c,n,true);
}
return vector<int>(c,c+x.size()+y.size()-1);
}
}
int fac[N],invfac[N];
vector<int> inv(vector<int> a)
{
int n=(int)a.size();
if(n==1)return vector<int>{qpow(a[0],MOD-2)};
int m=(n+1)>>1;
vector<int> b=inv(vector<int>(a.begin(),a.begin()+m));
int s=conv::getn(n+2*m-2);
conv::ntt(a,s,false);
conv::ntt(b,s,false);
F(i,0,s)b[i]=(int)((ull)b[i]*(2+(ull)(MOD-a[i])*b[i]%MOD)%MOD);
conv::ntt(b,s,true);
b.resize(n);
return b;
}
vector<int> deriv(const vector<int> &a)
{
int n=(int)a.size();
vector<int> b(n-1);
F(i,1,n)b[i-1]=(int)((ull)i*a[i]%MOD);
return b;
}
vector<int> integ(const vector<int> &a)
{
int n=(int)a.size()+1;
vector<int> b(n);
F(i,1,n)b[i]=(int)((ull)a[i-1]*invfac[i]%MOD*fac[i-1]%MOD);
return b;
}
vector<int> log(const vector<int> &a)
{
vector<int> b=conv::conv(deriv(a),inv(a));
b.resize(a.size()-1);
return integ(b);
}
int n,f[N],g[N];
int main()
{
read(n);
F(i,fac[0]=1,n+1)fac[i]=(int)((ull)fac[i-1]*i%MOD);
invfac[n]=qpow(fac[n],MOD-2);
for(int i=n;i;--i)invfac[i-1]=(int)((ull)invfac[i]*i%MOD);
int p2=1;
F(i,f[0]=1,n+1)
{
f[i]=(int)((ull)f[i-1]*p2%MOD);
reduce(p2<<=1);
}
F(i,1,n+1)f[i]=(int)((ull)f[i]*invfac[i]%MOD);
memcpy(g,log(vector<int>(f,f+n+1)).data(),sizeof(int)*(n+1));
int s=conv::getn(3*n+1);
F(i,1,n+1)g[i]=(int)((ull)g[i]*i%MOD);
conv::ntt(f,s,false);
conv::ntt(g,s,false);
F(i,0,s)f[i]=(int)((ull)f[i]*g[i]%MOD*g[i]%MOD);
conv::ntt(f,s,true);
int ans=(int)((ull)fac[n]*f[n]%MOD*inv2%MOD);
printf("%d\n",ans);
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 18128kb
input:
3
output:
9
result:
ok 1 number(s): "9"
Test #2:
score: 0
Accepted
time: 0ms
memory: 18124kb
input:
8
output:
130981312
result:
ok 1 number(s): "130981312"
Test #3:
score: 0
Accepted
time: 1ms
memory: 18104kb
input:
1
output:
0
result:
ok 1 number(s): "0"
Test #4:
score: 0
Accepted
time: 0ms
memory: 18128kb
input:
2
output:
1
result:
ok 1 number(s): "1"
Test #5:
score: 0
Accepted
time: 0ms
memory: 18128kb
input:
4
output:
96
result:
ok 1 number(s): "96"
Test #6:
score: 0
Accepted
time: 0ms
memory: 18128kb
input:
5
output:
1500
result:
ok 1 number(s): "1500"
Test #7:
score: 0
Accepted
time: 1ms
memory: 18124kb
input:
6
output:
37560
result:
ok 1 number(s): "37560"
Test #8:
score: 0
Accepted
time: 0ms
memory: 18256kb
input:
7
output:
1626912
result:
ok 1 number(s): "1626912"
Test #9:
score: 0
Accepted
time: 0ms
memory: 18252kb
input:
9
output:
591945260
result:
ok 1 number(s): "591945260"
Test #10:
score: 0
Accepted
time: 1ms
memory: 18252kb
input:
10
output:
877137661
result:
ok 1 number(s): "877137661"
Test #11:
score: 0
Accepted
time: 1ms
memory: 18128kb
input:
11
output:
654711510
result:
ok 1 number(s): "654711510"
Test #12:
score: 0
Accepted
time: 1ms
memory: 18124kb
input:
12
output:
896890421
result:
ok 1 number(s): "896890421"
Test #13:
score: 0
Accepted
time: 0ms
memory: 18132kb
input:
13
output:
544152239
result:
ok 1 number(s): "544152239"
Test #14:
score: 0
Accepted
time: 0ms
memory: 18252kb
input:
14
output:
203161729
result:
ok 1 number(s): "203161729"
Test #15:
score: 0
Accepted
time: 0ms
memory: 18124kb
input:
15
output:
686403302
result:
ok 1 number(s): "686403302"
Test #16:
score: 0
Accepted
time: 1ms
memory: 18128kb
input:
16
output:
551788068
result:
ok 1 number(s): "551788068"
Test #17:
score: 0
Accepted
time: 0ms
memory: 18072kb
input:
17
output:
778761614
result:
ok 1 number(s): "778761614"
Test #18:
score: 0
Accepted
time: 1ms
memory: 18128kb
input:
18
output:
372704747
result:
ok 1 number(s): "372704747"
Test #19:
score: 0
Accepted
time: 0ms
memory: 18120kb
input:
19
output:
48091879
result:
ok 1 number(s): "48091879"
Test #20:
score: 0
Accepted
time: 0ms
memory: 18128kb
input:
20
output:
811962966
result:
ok 1 number(s): "811962966"
Test #21:
score: 0
Accepted
time: 0ms
memory: 18260kb
input:
21
output:
580925653
result:
ok 1 number(s): "580925653"
Test #22:
score: 0
Accepted
time: 0ms
memory: 18080kb
input:
22
output:
473369147
result:
ok 1 number(s): "473369147"
Test #23:
score: 0
Accepted
time: 2ms
memory: 18128kb
input:
23
output:
370850086
result:
ok 1 number(s): "370850086"
Test #24:
score: 0
Accepted
time: 0ms
memory: 18124kb
input:
24
output:
633052748
result:
ok 1 number(s): "633052748"
Test #25:
score: 0
Accepted
time: 0ms
memory: 18120kb
input:
25
output:
760181773
result:
ok 1 number(s): "760181773"
Test #26:
score: 0
Accepted
time: 0ms
memory: 18052kb
input:
26
output:
618049730
result:
ok 1 number(s): "618049730"
Test #27:
score: 0
Accepted
time: 0ms
memory: 18128kb
input:
27
output:
197289938
result:
ok 1 number(s): "197289938"
Test #28:
score: 0
Accepted
time: 0ms
memory: 18080kb
input:
28
output:
708240707
result:
ok 1 number(s): "708240707"
Test #29:
score: 0
Accepted
time: 0ms
memory: 18092kb
input:
29
output:
726463024
result:
ok 1 number(s): "726463024"
Test #30:
score: 0
Accepted
time: 1ms
memory: 18252kb
input:
30
output:
587550457
result:
ok 1 number(s): "587550457"
Test #31:
score: 0
Accepted
time: 0ms
memory: 18056kb
input:
100
output:
721970458
result:
ok 1 number(s): "721970458"
Test #32:
score: 0
Accepted
time: 2ms
memory: 18404kb
input:
2562
output:
947609016
result:
ok 1 number(s): "947609016"
Test #33:
score: 0
Accepted
time: 1ms
memory: 18240kb
input:
3410
output:
462244613
result:
ok 1 number(s): "462244613"
Test #34:
score: 0
Accepted
time: 4ms
memory: 18476kb
input:
5712
output:
225049703
result:
ok 1 number(s): "225049703"
Test #35:
score: 0
Accepted
time: 6ms
memory: 18496kb
input:
10002
output:
577290168
result:
ok 1 number(s): "577290168"
Test #36:
score: 0
Accepted
time: 40ms
memory: 22588kb
input:
50012
output:
513616100
result:
ok 1 number(s): "513616100"
Test #37:
score: 0
Accepted
time: 72ms
memory: 23996kb
input:
75162
output:
197336463
result:
ok 1 number(s): "197336463"
Test #38:
score: 0
Accepted
time: 101ms
memory: 35224kb
input:
129257
output:
307374532
result:
ok 1 number(s): "307374532"
Test #39:
score: 0
Accepted
time: 253ms
memory: 49756kb
input:
202572
output:
342782823
result:
ok 1 number(s): "342782823"
Test #40:
score: 0
Accepted
time: 425ms
memory: 61140kb
input:
348252
output:
992752188
result:
ok 1 number(s): "992752188"
Test #41:
score: 0
Accepted
time: 595ms
memory: 70088kb
input:
452632
output:
374752381
result:
ok 1 number(s): "374752381"
Test #42:
score: 0
Accepted
time: 645ms
memory: 70696kb
input:
500000
output:
553811795
result:
ok 1 number(s): "553811795"