1. 程式人生 > 實用技巧 >「題解」SP106 【BINSTIRL - Binary Stirling Numbers】

「題解」SP106 【BINSTIRL - Binary Stirling Numbers】

題意簡述

\(\begin{Bmatrix}n \\ m\end{Bmatrix}\bmod2\)

題解

\[\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} \]

\(m\equiv1\space(\operatorname{mod}2)\) 的情況為組合數的遞推。

轉化一下,把填表轉移換成刷表,即

  • \(m\equiv0\space(\operatorname{mod}2)\) 時,\(\begin{Bmatrix}n \\ m\end{Bmatrix}\) 轉移到 \(\begin{Bmatrix}n+1 \\ m+1\end{Bmatrix}\)

  • \(m\equiv1\space(\operatorname{mod}2)\) 時,\(\begin{Bmatrix}n \\ m\end{Bmatrix}\) 轉移到 \(\begin{Bmatrix}n+1 \\ m+1\end{Bmatrix}\)

    \(\begin{Bmatrix}n+1 \\ m\end{Bmatrix}\)

那麼這個題目就轉化成了在表格上 \((0,0)\) 走到 \((n,m)\) 的路徑條數 \(\operatorname{mod}2\) 問題。

兩種情況都可以轉移到 \(\begin{Bmatrix}n+1 \\ m+1\end{Bmatrix}\),為了方便起見,我們定義這種情況為向右上轉移,把 \(\begin{Bmatrix}n+1 \\ m\end{Bmatrix}\) 定義為向上轉移。

因為我們轉移只能向上或右上走,所以只會走 \(n\) 步,其中 \(m\) 次向右上轉移,\(n-m\) 次向右轉移。

我們一共有 \(\lfloor\frac{m+1}{2}\rfloor\) 次機會向右轉移(只能從奇數走)。

相當於我們現在需要把轉移的過程分成 \(n-m\) 段,每一段的內部全部都是向右上轉移,這樣我們才能到達 \((n,m)\)

用盒子與球的語言來描述,就是一共就有 \(n-m+\lfloor\frac{m+1}{2}\rfloor\) 個球(這裡理解起來其實特別麻煩)(不過只是對於我這種組合差的人),分成 \(\lfloor\frac{m+1}{2}\rfloor\) 段,隔板即可。

於是 \(\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\)

關於組合數奇偶性,我這篇部落格裡寫過,再貼上來:

結論:\(\dbinom{n}{m}\equiv0\space(\operatorname{mod}2)\) 當且僅當 \(n\operatorname{bitand}m=m\)

證明(也許不是特別嚴謹):我們可以知道:

\[{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 \]

我們發現:

\[{\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} \]

這一坨,就是在一直進行二進位制移位,\(\operatorname{shr}1\)

那麼我們可以得出一個結論:如果對於我們記 \((n)_{k}\) 表示 \(n\) 在二進位制意義下的第 \(k\) 位。\((n)_{k}\in[0,1]\)

那麼對於 \(\forall i\),有 \((n)_{i}=0\)\((m)_{i}=1\),那麼 \(\dbinom{n}{m}\equiv0\space(\operatorname{mod} 2)\)

所以 \(n\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;
}