1493: 棋盘游戏(ac)

题目描述

1493: 棋盘游戏(ac)_第1张图片

题解

设实际反色行数为 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 
#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>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;
}

你可能感兴趣的:(数学)