洛谷T200187
考虑走了
我们使用卡特兰数的折线法去重。
以下令向左走一次变为向右上走一次,向右走一次变为向右下走一次(注意这里定义的转换,下文会多次用到),最终会走到点
显然合法的方案一定不能在
所以合法的方案一定是从
问题转化为从
到这里已经跟卡特兰数的折线法很像了,可以自己思考了,不在举例。
首先总的方案数为
对任意一种不合法的方案数,在第一次超过规定线的地方停止,将后面翻转,得到的方案数为
两者相减即可,乘上概率。
代码如下,注意如何实现
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=998244353;
const int N=1e7+10;
int read()
{
int x=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-f;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-48;s=getchar();}
return x*f;
}
ll n,m,a,b;
ll jc[N],inv[N],inv1[N];
ll quickpow(ll a,ll b,ll c)
{
ll res=1;
a%=c;
while(b)
{
if(b&1) res=(res*a)%c;
a=(a*a)%c;
b>>=1;
}
return res;
}
ll C(ll n,ll m)
{
if(n<m||m<0) return 0;
if(!m) return 1;
return jc[n]*inv[m]%mod*inv[n-m]%mod;
}
int main()
{
n=read(),m=read(),a=read(),b=read();
jc[0]=1;
for(int i=1;i<=m;i++) jc[i]=(jc[i-1]*i)%mod;
inv[m]=quickpow(jc[m],mod-2,mod);
for(int i=m;i>=1;i--) inv[i-1]=(inv[i]*i)%mod;
ll pc=1;
for(int i=1;i<=m;i++) pc=(pc*(a+b))%mod;
inv1[m]=quickpow(pc,mod-2,mod);
for(int i=m;i>=1;i--) inv1[i-1]=(inv1[i]*(a+b))%mod;
ll ans=0;
for(ll i=0,pa=1,pb=quickpow(b,n,mod);(i<<1)+n<=m;i++)
{
ans=(ans+((pa*pb%mod)*inv1[(i<<1)+n]%mod)*(C((i<<1)+n-1,i)-C((i<<1)+n-1,i-1)+mod)%mod)%mod;
pa=(pa*a)%mod;
pb=(pb*b)%mod;
}
printf("%lld",ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构