1493: 棋盘游戏(ac)

题目描述

在这里插入图片描述

题解

设实际反色行数为 r r r,则 c c c可以推出来
N c + M r − 2 r c = S Nc+Mr-2rc=S Nc+Mr2rc=S
所以我们可以枚举r,当遇到合法的r和c时,其对应方案是为
C N r ∗ C M c ∗ H N R − r 2 ∗ H M C − c 2 C_N^r*C_M^c*H_N^{\frac{R-r}{2}}*H_M^{\frac{C-c}{2}} CNrCMcHN2RrHM2Cc
其中 H n m H_n^m Hnm表示为从 n n n中可重复选出 m m m个元素
具体特判见代码

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const LL P=1e9+7,N=2e5+5;
LL n,m,r,c,s,jc[N],ny[N],a;
LL K(LL x,LL y){
    LL A=1;while(y){
        if (y&1) A=A*x%P;
        x=x*x%P;y>>=1;
    }return A;
}
LL C(LL x,LL y){
    if (x<y) return 0;
    return jc[x]*ny[y]%P*ny[x-y]%P;
}
int main(){
    jc[0]=1;for (LL i=1;i<N;i++) jc[i]=i*jc[i-1]%P;
    ny[N-1]=K(jc[N-1],P-2);for (LL i=N-1;i;i--) ny[i-1]=i*ny[i]%P;
    scanf("%lld%lld%lld%lld%lld",&n,&m,&r,&c,&s);
    for (LL i=0;i<=r;i++){
        if (n-2*i==0){
            if (s-m*i==0){
                LL x=r-i>>1ll;
                a=(a+C(n,i)*C(n+x-1,x)%P*C(m+c-1,c)%P)%P;
            }
            continue;
        }
        if ((s-m*i)%(n-2*i)) continue;
        LL j=(s-m*i)/(n-2*i);
        if (j>c || j<0 || ((r-i)&1ll) || ((c-j)&1ll)) continue;
        LL x=r-i>>1ll,y=c-j>>1ll;
        a=(a+C(n,i)*C(m,j)%P*C(n+x-1,x)%P*C(m+y-1,y)%P)%P;
    }
    return printf("%lld\n",a),0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值