「題解」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}\)
那麼這個題目就轉化成了在表格上 \((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;
}