Solution -「UVA 1118」Binary Stirling Numbers

cirnovsky /

§ 题意简述

{nm}mod2\begin{Bmatrix}n \\ m\end{Bmatrix}\bmod2

§ 题解

{nm}mod2=({n1m1}+m{n1m})mod2={{n1m1}mod2,m0 (mod2)({n1m1}+{n1m})mod2,m1 (mod2)\begin{aligned} \begin{Bmatrix}n \\ m\end{Bmatrix}\bmod2 &=\left(\begin{Bmatrix}n-1 \\ m-1\end{Bmatrix}+m\begin{Bmatrix}n-1 \\ m\end{Bmatrix}\right)\bmod2 \\ &=\begin{cases} \begin{Bmatrix}n-1 \\ m-1\end{Bmatrix}\bmod2,m\equiv0\space(\operatorname{mod}2) \\ \left(\begin{Bmatrix}n-1 \\ m-1\end{Bmatrix}+\begin{Bmatrix}n-1 \\ m\end{Bmatrix}\right)\bmod2,m\equiv1\space(\operatorname{mod}2) \end{cases} \end{aligned}

m1 (mod2)m\equiv1\space(\operatorname{mod}2) 的情况为组合数的递推。

转化一下,把填表转移换成刷表,即

  • m0 (mod2)m\equiv0\space(\operatorname{mod}2) 时,{nm}\begin{Bmatrix}n \\ m\end{Bmatrix} 转移到 {n+1m+1}\begin{Bmatrix}n+1 \\ m+1\end{Bmatrix}

  • m1 (mod2)m\equiv1\space(\operatorname{mod}2) 时,{nm}\begin{Bmatrix}n \\ m\end{Bmatrix} 转移到 {n+1m+1}\begin{Bmatrix}n+1 \\ m+1\end{Bmatrix}{n+1m}\begin{Bmatrix}n+1 \\ m\end{Bmatrix}

那么这个题目就转化成了在表格上 (0,0)(0,0) 走到 (n,m)(n,m) 的路径条数 mod2\operatorname{mod}2 问题。

两种情况都可以转移到 {n+1m+1}\begin{Bmatrix}n+1 \\ m+1\end{Bmatrix},为了方便起见,我们定义这种情况为向右上转移,把 {n+1m}\begin{Bmatrix}n+1 \\ m\end{Bmatrix} 定义为向上转移。

因为我们转移只能向上或右上走,所以只会走 nn 步,其中 mm 次向右上转移,nmn-m 次向右转移。

我们一共有 m+12\lfloor\frac{m+1}{2}\rfloor 次机会向右转移(只能从奇数走)。

相当于我们现在需要把转移的过程分成 nmn-m 段,每一段的内部全部都是向右上转移,这样我们才能到达 (n,m)(n,m)

用盒子与球的语言来描述,就是一共就有 nm+m+12n-m+\lfloor\frac{m+1}{2}\rfloor 个球(这里理解起来其实特别麻烦)(不过只是对于我这种组合差的人),分成 m+12\lfloor\frac{m+1}{2}\rfloor 段,隔板即可。

于是 {nm}mod2=(nm+m+121m+121)mod2\begin{Bmatrix}n \\ m\end{Bmatrix}\bmod2={n-m+\lfloor\frac{m+1}{2}\rfloor-1\choose\lfloor\frac{m+1}{2}\rfloor-1}\bmod2

关于组合数奇偶性,我这篇博客里写过,再贴上来:

结论:(nm)0 (mod2)\dbinom{n}{m}\equiv0\space(\operatorname{mod}2) 当且仅当 nbitandm=mn\operatorname{bitand}m=m

证明(也许不是特别严谨):我们可以知道:

(nm)=(n2m2)×(nmod2mmod2)=(n22m22)×(n2mod2m2mod2)×(nmod2mmod2)={n\choose m}={\lfloor\frac{n}{2}\rfloor\choose\lfloor\frac{m}{2}\rfloor}\times{n\bmod 2\choose m\bmod2}={\lfloor\frac{\lfloor\frac{n}{2}\rfloor}{2}\rfloor\choose\lfloor\frac{\lfloor\frac{m}{2}\rfloor}{2}\rfloor}\times {\lfloor\frac{n}{2}\rfloor\bmod2\choose\lfloor\frac{m}{2}\rfloor\bmod2}\times{n\bmod 2\choose m\bmod2}=\cdots

我们发现:

(n22m22){\lfloor\frac{\lfloor\frac{\lfloor\frac{n}{2}\rfloor}{2}\rfloor}{\cdots}\rfloor\choose\lfloor\frac{\lfloor\frac{\lfloor\frac{m}{2}\rfloor}{2}\rfloor}{\cdots}\rfloor}

这一坨,就是在一直进行二进制移位,shr1\operatorname{shr}1

那么我们可以得出一个结论:如果对于我们记 (n)k(n)_{k} 表示 nn 在二进制意义下的第 kk 位。(n)k[0,1](n)_{k}\in[0,1]

那么对于 i\forall i,有 (n)i=0(n)_{i}=0(m)i=1(m)_{i}=1,那么 (nm)0 (mod2)\dbinom{n}{m}\equiv0\space(\operatorname{mod} 2)

所以 nbitandm=mn\operatorname{bitand}m=m,证毕。

答案显然。

#include <cstdio>

int N, M;

int main () {
	int TC; scanf ( "%d", &TC ); while ( TC -- > 0 ) {
		scanf ( "%d%d", &N, &M );
		if ( ! N && ! M )	puts ( "1" );
		else if ( ! N || ! M || N < M )	puts ( "0" );
		else if ( ( ( N - M + ( ( M + 1 ) >> 1 ) - 1 ) & ( ( ( M + 1 ) >> 1 ) - 1 ) ) == ( ( ( M + 1 ) >> 1 ) - 1 ) )	puts ( "1" );
		else	puts ( "0" );
	}
	return 0;
}