时间限制: 1.0 秒ios
空间限制: 256 MB测试
球球是一位建筑师。一天,他收到市长的任务:建设城市。球球打算建造 2n 座高楼。为了保证城市美观,球球作出了以下计划:spa
球球把本身的想法告诉了市长。市长但愿得知全部建设城市的方案数。两种方案不一样,当且仅当某座高楼的高度在两个方案中不一样。这个问题可难倒了球球。球球找到了你,但愿你能帮他算出答案。因为答案可能很大,你只须要给出答案对 998244353 取模后的结果。.net
从标准输入读入数据。code
仅一行四个整数 m,n,x,y,变量意义见题目描述。视频
输出到标准输出。blog
仅一行一个整数表示答案。ci
3 2 1 3
10
全部的方案为:{1,1,1,1},{1,2,1,1},{1,3,1,1},{2,2,2,1},{2,2,2,2},{2,3,2,1},{2,3,2,2},{3,3,3,1},{3,3,3,2},{3,3,3,3}。get
1000 1000 535 1477
295916566
1.只在1~4的条件下(先不考虑x,y)若是一块区域有 n 栋高楼,m 个高度能够选,则至关于 n个相同的球放入 m 个不一样的盒子 的方案数,因为楼的高度能够相等,则至关于n+m个相同的球放入 m 个不一样的盒子 的方案数,每一个盒子至少放一球。由插板法可知方案数io
2.再考虑条件5,题目没有告诉咱们 x,y 是否在 n 的两侧,因此要分状况讨论
(1)case1:x≤n<y
枚举 x,y的高度。假设当前 x,y的高度为 i,则:
根据乘法原理,将以上四种状况相乘便可。
(2)Case 2:y≤n 或 x,y>n。
将 [x,y] 中间的高楼当作一个高楼,则至关于
#include<iostream> using namespace std; const int mod=998244353; int m,n,x,y; long long int ans=0; int inverse(int x,int mod) { int power=mod-2; x %= mod; int num = 1; for (; power; power >>= 1, (x *= x) %= mod) if(power & 1) (num *= x) %= mod; return num; } int cn(int a,int b)//组合数计算 { int sum=1; for(int i=1;i<=b;i++) { sum=sum*(a-b+i)%mod; sum=sum*inverse(i,mod)%mod;//求i模mod的逆元 } return sum; } int main() { cin>>m>>n>>x>>y; if(x<=n&&y>=n)//case1状况 { for(int i=1;i<=m;i++) ans+=cn(x+i-1,i-1)*cn(n-x+m-i,m-i)*cn(y-n+m-i,m-i)*cn(2*n-y+i-1,i-1)%mod; cout<<ans; } else { ans=cn(n+m-1,m-1)*cn(n+m-1-x+y,m-1)%mod; cout<<ans; } return 0; }