QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#19817 | #1816. Multiple Parentheses | conqueror_of_zky# | AC ✓ | 1263ms | 131456kb | C++20 | 6.1kb | 2022-02-11 15:59:03 | 2022-05-06 07:13:37 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define maxn 4000005
#define mod 998244353
#define LL long long
void Inc(int &x,int y) { x+=y; (x>=mod)&&(x-=mod); }
int sub(int x,int y) { x-=y; (x<0)&&(x+=mod); return x;}
inline int Pow(int b, int k,int r=1) { for(;k;k>>=1,b=1ll*b*b%mod) if(k&1) r=1ll*r*b%mod; return r; }
namespace Math {
LL w;
struct N{ LL a,b; };
N operator * (const N &x,const N &y){ return (N){(x.a*y.a+w*x.b%mod*y.b)%mod,(x.a*y.b+y.a*x.b)%mod}; }
inline LL power(N n,LL x) { N res=(N){1,0}; for(;x;n=n*n,x>>=1) if(x&1) res=res*n; return res.a; }
inline bool check(LL x){return power((N){x,0},(mod-1)>>1)==1;}
inline int work(LL n){
mt19937 rnd(time(0));
if(n==0) return 0; LL a=rnd()%mod; while(!a||check((a*a+mod-n)%mod)) a=rnd()%mod;
w=(a*a+mod-n)%mod; int ans=power((N){a,1},(mod+1)>>1); return min(ans,mod-ans);
}
}
#define inv2 499122177
#define I 86583718
int Wl,Wl2,w[maxn],lg[maxn],inv[maxn];
inline void init(int n) {
for(Wl=1;n>=Wl<<1;Wl<<=1); int pw=Pow(3,(mod-1)/(Wl2=Wl<<1));
w[Wl]=inv[0]=inv[1]=1;
for(int i=Wl+1;i<=Wl2;i++) w[i]=w[i-1]*1ll*pw%mod; for(int i=Wl-1;i>=1;i--) w[i]=w[i<<1];
for(int i=2;i<=Wl2;i++) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod,lg[i]=lg[i>>1]+1;
}
inline int upd(int x) { return x+=x>>31&mod; }
inline void NTT(int *A, int n, int tp) {
static int r[maxn]={}; static unsigned LL ar[maxn]={}; if(tp^1) reverse(A+1,A+n);
for(int i=0;i<n;i++) r[i]=(r[i>>1]>>1|(i&1)<<lg[n]-1),ar[i]=upd(A[r[i]]);
for(int L=1;L<n;L<<=1) for(int s=0,L2=L<<1;s<n;s+=L2)
for(int k=s,x=L,t;x<L2;x++,k++) t=ar[k+L]*w[x]%mod,ar[k+L]=ar[k]-t+mod,ar[k]+=t;
for(int i=0;i<n;i++) A[i]=ar[i]%mod;
if(tp^1) for(int i=0;i<n;i++) A[i]=1ll*A[i]*inv[n]%mod;
}
#define Poly vector<int>
inline Poly Sub(Poly A,Poly B) {
if(A.size()<B.size()) A.resize(B.size()); else if(A.size()>B.size()) B.resize(A.size());
Poly C; C.resize(A.size()); for(int i=0;i<(int)A.size();i++) C[i]=sub(A[i],B[i]); return C;
}
inline Poly Der(Poly A) { int n=A.size(); for(int i=1;i<n;i++) A[i-1]=1ll*i*A[i]%mod; A[n-1]=0; return A; }
inline Poly Int(Poly A) { int n=A.size(); for(int i=n-1;i>0;i--) A[i]=1ll*A[i-1]*inv[i]%mod; A[0]=0; return A; }
namespace SemiConvol {
Poly p[5][16],A;
void ln(Poly &res,int l,int r,int n,int dep=0) {
if(r-l<=256) { r=min(r,n);
for(int i=l;i<r;++i) {
if(i==0) res[i]=0; else res[i]=sub(A[i],1ll*inv[i]*res[i]%mod);
for(int j=i+1;j<r;++j) res[j]=(res[j]+1ll*res[i]*A[j-i]%mod*i)%mod;
} return;
} int sz=r-l>>4; vector<LL>w[16]; Poly T(sz*2);
int lim=0; for(;lim<16;lim++) { if(l+lim*sz>=n) break; w[lim].resize(sz<<1); }
for(int i=0;i<lim;i++) {
if(i) {
for(int j=0;j<sz*2;j++) T[j]=w[i][j]%mod; NTT(T.data(),sz*2,-1);
for(int j=0;j<sz;j++) Inc(res[l+i*sz+j],T[sz+j]);
} ln(res,l+i*sz,l+(i+1)*sz,n,dep+1);
if(i<lim-1) {
for(int j=0;j<sz;j++) T[j+sz]=0,T[j]=1ll*res[l+i*sz+j]*(l+i*sz+j)%mod; NTT(T.data(),sz<<1,1);
for(int j=i+1;j<lim;j++) for(int k=0;k<sz*2;++k) w[j][k]+=1ll*T[k]*p[dep][j-i-1][k];
}
}
}
void exp(Poly &res,int l,int r,int n,int dep=0) {
if(r-l<=256) { r=min(r,n);
for(int i=l;i<r;++i) {
if(i==0) res[i]=1; else res[i]=1ll*res[i]*inv[i]%mod;
for(int j=i+1;j<r;++j) res[j]=(res[j]+1ll*res[i]*A[j-i]%mod*(j-i))%mod;
} return;
} int sz=r-l>>4; vector<LL>w[16]; Poly T(sz*2);
int lim=0; for(;lim<16;lim++) { if(l+lim*sz>=n) break; w[lim].resize(sz<<1); }
for(int i=0;i<lim;i++) {
if(i) {
for(int j=0;j<sz*2;j++) T[j]=w[i][j]%mod; NTT(T.data(),sz*2,-1);
for(int j=0;j<sz;j++) Inc(res[l+i*sz+j],T[sz+j]);
} exp(res,l+i*sz,l+(i+1)*sz,n,dep+1);
if(i<lim-1) {
for(int j=0;j<sz;j++) T[j+sz]=0,T[j]=res[l+i*sz+j]; NTT(T.data(),sz*2,1);
for(int j=i+1;j<lim;j++) for(int k=0;k<sz*2;++k) w[j][k]+=1ll*T[k]*p[dep][j-i-1][k];
}
}
}
}
Poly Exp(Poly A) {
int n=A.size(),l=1<<lg[n]+1; A.resize(l<<1); Poly res(l); SemiConvol::A=A;
for(int le=l,dep=0;le>256;le>>=4,dep++) {
int sz=le>>4;
for(int i=0;i<16;i++) {
SemiConvol::p[dep][i].resize(sz*2);
for(int j=0;j<(sz<<1);j++) SemiConvol::p[dep][i][j]=1ll*A[i*sz+j]*(i*sz+j)%mod;
NTT(SemiConvol::p[dep][i].data(),sz*2,1);
}
} SemiConvol::exp(res,0,l,n); res.resize(n); return res;
}
Poly Ln(Poly A) {
int n=A.size(),l=1<<lg[n]+1; A.resize(l<<1); Poly res(l); SemiConvol::A=A;
for(int le=l,dep=0;le>256;le>>=4,dep++) {
int sz=le>>4;
for(int i=0;i<16;i++) {
SemiConvol::p[dep][i].resize(sz*2);
for(int j=0;j<(sz<<1);j++) SemiConvol::p[dep][i][j]=1ll*A[i*sz+j]%mod;
NTT(SemiConvol::p[dep][i].data(),sz*2,1);
}
} SemiConvol::ln(res,0,l,n); res.resize(n); return res;
}
inline Poly Sqrt_Rec(Poly A) {
static int t[maxn]; int n=A.size();A.resize(n<<1); Poly C{Pow(Math::work(A[0]),mod-2)};
for(int k=2;k<(n<<1);k<<=1) {
Poly B=C; B.resize(k<<1); memcpy(t,A.data(),k<<2); NTT(B.data(),k<<1,1); NTT(t,k<<1,1);
for(int i=0;i<(k<<1);i++) t[i]=1ll*B[i]*t[i]%mod*B[i]%mod*B[i]%mod;
NTT(t,k<<1,-1); C.resize(k); for(int i=(k>>1);i<k;i++) C[i]=t[i]?mod-1ll*inv2*t[i]%mod:0;
} C.resize(n); return C;
}
inline Poly Pow(Poly A,int k) {
int n=A.size(); A=Ln(A);
for(int i=1;i<n;i++) A[i]=1ll*A[i]*k%mod;
return Exp(A);
}
inline int Init(int n) { int m; for(m=1;m<=n;m<<=1); init(m); return m; }
int n,k,m; Poly a;
#define int long long
int jc[2000005],Inv[2000005],jcinv[2000005];
inline int C(int x,int y)
{
return jc[x]*jcinv[y]%mod*jcinv[x-y]%mod;
}
/*#undef int
inline vector <int> ksm(vector <int> a,int y)
{
vector <int> rtn;
rtn.push_back(1);
while(y)
{
if(y&1)
{
rtn=multiply(rtn,a);
while(rtn.size()>m+1) rtn.pop_back();
}
a=multiply(a,a),y>>=1;
while(a.size()>m+1) a.pop_back();
}
return rtn;
}
#define int long long*/
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
jc[0]=jc[1]=jcinv[0]=jcinv[1]=Inv[1]=1;
for(int i=2;i<=2000000;i++)
{
jc[i]=jc[i-1]*i%mod;
Inv[i]=(mod-mod/i)*Inv[mod%i]%mod;
jcinv[i]=jcinv[i-1]*Inv[i]%mod;
}
cin >> n >> m >> k;
Init(m+1);
a.resize(m+1);a[0]=1;
for(int i=1;i<=m;i++)
a[i]=(C(i+i,i)*Inv[i+1]%mod);
a[k]=0;
#undef int
a=Pow(a,n);
cout << a.back();
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 89ms
memory: 52492kb
input:
2 2 1
output:
4
result:
ok answer is '4'
Test #2:
score: 0
Accepted
time: 86ms
memory: 51360kb
input:
1 1 1
output:
0
result:
ok answer is '0'
Test #3:
score: 0
Accepted
time: 108ms
memory: 51632kb
input:
24 120 30
output:
379268651
result:
ok answer is '379268651'
Test #4:
score: 0
Accepted
time: 90ms
memory: 51380kb
input:
1451 1598 1130
output:
884873572
result:
ok answer is '884873572'
Test #5:
score: 0
Accepted
time: 114ms
memory: 52756kb
input:
1324 1742 1033
output:
856733047
result:
ok answer is '856733047'
Test #6:
score: 0
Accepted
time: 100ms
memory: 51152kb
input:
1378 1614 1335
output:
869903701
result:
ok answer is '869903701'
Test #7:
score: 0
Accepted
time: 77ms
memory: 51832kb
input:
1071 1907 1281
output:
327700529
result:
ok answer is '327700529'
Test #8:
score: 0
Accepted
time: 98ms
memory: 51764kb
input:
1204 1337 1277
output:
475981175
result:
ok answer is '475981175'
Test #9:
score: 0
Accepted
time: 108ms
memory: 50912kb
input:
146 246 100
output:
404402509
result:
ok answer is '404402509'
Test #10:
score: 0
Accepted
time: 90ms
memory: 52140kb
input:
226 183 144
output:
351921989
result:
ok answer is '351921989'
Test #11:
score: 0
Accepted
time: 71ms
memory: 50832kb
input:
234 287 158
output:
658959115
result:
ok answer is '658959115'
Test #12:
score: 0
Accepted
time: 96ms
memory: 51980kb
input:
242 156 122
output:
325586111
result:
ok answer is '325586111'
Test #13:
score: 0
Accepted
time: 83ms
memory: 51164kb
input:
168 271 135
output:
181613866
result:
ok answer is '181613866'
Test #14:
score: 0
Accepted
time: 80ms
memory: 51868kb
input:
22 25 1
output:
684860973
result:
ok answer is '684860973'
Test #15:
score: 0
Accepted
time: 94ms
memory: 51260kb
input:
45 22 15
output:
217501624
result:
ok answer is '217501624'
Test #16:
score: 0
Accepted
time: 81ms
memory: 52472kb
input:
47 29 16
output:
690840771
result:
ok answer is '690840771'
Test #17:
score: 0
Accepted
time: 72ms
memory: 50764kb
input:
2 25 25
output:
660660974
result:
ok answer is '660660974'
Test #18:
score: 0
Accepted
time: 61ms
memory: 52032kb
input:
32 34 11
output:
133387056
result:
ok answer is '133387056'
Test #19:
score: 0
Accepted
time: 166ms
memory: 60064kb
input:
88196 118335 104471
output:
7192211
result:
ok answer is '7192211'
Test #20:
score: 0
Accepted
time: 118ms
memory: 56756kb
input:
142215 57117 51272
output:
627598793
result:
ok answer is '627598793'
Test #21:
score: 0
Accepted
time: 133ms
memory: 55228kb
input:
102255 60360 51525
output:
447649003
result:
ok answer is '447649003'
Test #22:
score: 0
Accepted
time: 127ms
memory: 59676kb
input:
132449 83413 54230
output:
215816803
result:
ok answer is '215816803'
Test #23:
score: 0
Accepted
time: 113ms
memory: 60368kb
input:
68499 95762 77190
output:
393029560
result:
ok answer is '393029560'
Test #24:
score: 0
Accepted
time: 936ms
memory: 126264kb
input:
751951 751951 1
output:
804170883
result:
ok answer is '804170883'
Test #25:
score: 0
Accepted
time: 139ms
memory: 52128kb
input:
804420 1962 410
output:
869056555
result:
ok answer is '869056555'
Test #26:
score: 0
Accepted
time: 181ms
memory: 55224kb
input:
828607 63739 13
output:
926542030
result:
ok answer is '926542030'
Test #27:
score: 0
Accepted
time: 110ms
memory: 52760kb
input:
472167 20529 23
output:
142703540
result:
ok answer is '142703540'
Test #28:
score: 0
Accepted
time: 414ms
memory: 88288kb
input:
363438 363438 1
output:
764563597
result:
ok answer is '764563597'
Test #29:
score: 0
Accepted
time: 1263ms
memory: 131456kb
input:
1000000 1000000 628333
output:
283487375
result:
ok answer is '283487375'
Test #30:
score: 0
Accepted
time: 1224ms
memory: 131404kb
input:
1000000 1000000 900084
output:
651386967
result:
ok answer is '651386967'
Test #31:
score: 0
Accepted
time: 1232ms
memory: 131392kb
input:
1000000 1000000 27328
output:
621963453
result:
ok answer is '621963453'
Test #32:
score: 0
Accepted
time: 1229ms
memory: 131332kb
input:
1000000 1000000 538409
output:
997879100
result:
ok answer is '997879100'
Test #33:
score: 0
Accepted
time: 1238ms
memory: 131404kb
input:
1000000 1000000 928121
output:
964724707
result:
ok answer is '964724707'
Test #34:
score: 0
Accepted
time: 950ms
memory: 125256kb
input:
685624 665877 563708
output:
257429683
result:
ok answer is '257429683'
Test #35:
score: 0
Accepted
time: 1156ms
memory: 130136kb
input:
692290 942095 553970
output:
82511143
result:
ok answer is '82511143'
Test #36:
score: 0
Accepted
time: 1013ms
memory: 126244kb
input:
579579 765702 631728
output:
954001361
result:
ok answer is '954001361'
Test #37:
score: 0
Accepted
time: 856ms
memory: 124048kb
input:
756854 634736 567170
output:
393747028
result:
ok answer is '393747028'
Test #38:
score: 0
Accepted
time: 1231ms
memory: 131356kb
input:
649175 997874 511181
output:
242172216
result:
ok answer is '242172216'
Test #39:
score: 0
Accepted
time: 1246ms
memory: 131452kb
input:
786431 1000000 999999
output:
627359027
result:
ok answer is '627359027'