提交时间:2024-10-30 15:35:03
运行 ID: 33927
#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define pb push_back int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=510,N=20,Mod=998244353; int Pow(int x,int y){int rt=1;while(y){if(y&1)rt=rt*x%Mod;x=x*x%Mod,y>>=1;}return rt;} int n; struct node{ int x; node operator*(const node&y)const{ return (node){x*y.x%Mod}; } node operator+(const node&y)const{ return (node){x+y.x%Mod}; } node operator*(const int&y)const{ return (node){x*y%Mod}; } void operator+=(const node&G){ x=(x+G.x)%Mod; } void operator+=(const int&G){ x=(x+G)%Mod; } }p,f[MAXN][MAXN],g[MAXN][MAXN],jc[MAXN],ny[MAXN]; node operator-(int x,node y){return (node){x-y.x+Mod};} node Pow(node x,int y){node rt={1};while(y){if(y&1)rt=rt*x;x=x*x,y>>=1;}return rt;} node C(int x,int y){return jc[x]*ny[x-y]*ny[y];} void slv(){ n=read(),p.x=read(),p=p*Pow((node){read()},Mod-2); jc[0]=ny[0]={1};for(int i=1;i<=n;i++)jc[i]=jc[i-1]*i,ny[i]=Pow(jc[i],Mod-2); for(int i=0;i<=n;i++)f[0][i]=g[0][i]={1}; for(int i=1;i<=n;i++){ for(int x=0;x<=n;x++){ for(int j=0;j<i;j++){ f[i][x]+=(p*f[j][x+1]+(1-p)*(x?f[j][x-1]:(node){0}))*C(i-1,j)*g[i-j-1][x]; } for(int j=0;j<=i;j++){ g[i][x]+=f[i-j][x]*f[j][x]*C(i,j); } } } node ans=f[n][0]; for(int i=1;i<=2*n;i+=2)ans=ans*Pow((node){i},Mod-2); printf("%lld",ans.x); } signed main(){ slv(); return 0; }