【POJ1430】Binary Stirling Numbers(第二类斯特林数,组合数)

数学、数论 同时被 3 个专栏收录
39 篇文章 0 订阅
10 篇文章 0 订阅
3 篇文章 0 订阅

{ n m }   m o d   2 \begin{Bmatrix}n\\m\end{Bmatrix}\bmod 2 {nm}mod2 的值。

由第二类斯特林数的递推公式:
{ n m } = { n − 1 m − 1 } + m { n m } \begin{Bmatrix}n\\m\end{Bmatrix}=\begin{Bmatrix}n-1\\m-1\end{Bmatrix}+m\begin{Bmatrix}n\\m\end{Bmatrix} {nm}={n1m1}+m{nm}
可知:
{ n m } ≡ { { n − 1 m − 1 } if  m   m o d   2 = 0 { n − 1 m − 1 } + { n m } if  m   m o d   2 = 1 ( m o d 2 ) \begin{Bmatrix}n\\m\end{Bmatrix}\equiv \begin{cases} \begin{Bmatrix}n-1\\m-1\end{Bmatrix}&\text{if }m\bmod 2=0\\ \begin{Bmatrix}n-1\\m-1\end{Bmatrix}+\begin{Bmatrix}n\\m\end{Bmatrix}&\text{if }m\bmod 2=1 \end{cases} \pmod 2 {nm}{n1m1}{n1m1}+{nm}if mmod2=0if mmod2=1(mod2)
我们把这个转移图给画出来:(图来自于 rui_er

首先,若 m m m 为偶数,则 { n m } ≡ { n − 1 m − 1 } ( m o d 2 ) \begin{Bmatrix}n\\m\end{Bmatrix}\equiv\begin{Bmatrix}n-1\\m-1\end{Bmatrix}\pmod 2 {nm}{n1m1}(mod2),所以我们默认 m m m 为奇数。

那么按照上面的转移图,从 ( 0 , 0 ) (0,0) (0,0) 走到 ( n , m ) (n,m) (n,m) 的路径数的奇偶性就是 { n m } \begin{Bmatrix}n\\m\end{Bmatrix} {nm} 的奇偶性,所以我们只需要求出从 ( 0 , 0 ) (0,0) (0,0) 走到 ( n , m ) (n,m) (n,m) 的路径数即可。

显然我们一共要走 n n n 条边,其中有 m m m 条边是红边,那么有 n − m n-m nm 条绿边。

注意到除了一开始走的第一条红边之外其它红边都是一走就连续走一组(两条)的,所以如果我们把第一条红边也算作一组,那么就共有 m + 1 2 \dfrac{m+1}{2} 2m+1 组。

组与组之间、最后一组后面,这 m + 1 2 \dfrac{m+1}{2} 2m+1 个地方都可以走若干条(包括 0 0 0 条)绿边。

现在要把 n − m n-m nm 条绿边分配到这 m + 1 2 \dfrac{m+1}{2} 2m+1 个地方,设 a = n − m , b = m + 1 2 a=n-m,b=\dfrac{m+1}{2} a=nm,b=2m+1,那么由插板法可知方案数为 ( a + b − 1 b − 1 ) \dbinom{a+b-1}{b-1} (b1a+b1),这个就是从 ( 0 , 0 ) (0,0) (0,0) 走到 ( n , m ) (n,m) (n,m) 的路径数。

接下来怎么办呢?

引理: ( n m ) \dbinom{n}{m} (mn) 为奇数当且仅当 n bitand ⁡ m = m n\operatorname{bitand}m=m nbitandm=m

证明:

由卢卡斯定理:
( n m ) ≡ ( ⌊ n 2 ⌋ ⌊ n 2 ⌋ ) × ( n   m o d   2 m   m o d   2 ) ≡ ( ⌊ ⌊ n 2 ⌋ 2 ⌋ ⌊ ⌊ n 2 ⌋ 2 ⌋ ) × ( ⌊ n 2 ⌋   m o d   2 ⌊ n 2 ⌋   m o d   2 ) × ( n   m o d   2 m   m o d   2 ) ≡ ⋯ ( m o d 2 ) \binom{n}{m} \equiv\binom{\lfloor\frac{n}{2}\rfloor}{\lfloor\frac{n}{2}\rfloor}\times\binom{n\bmod 2}{m\bmod 2} \equiv \binom{\lfloor\frac{\lfloor\frac{n}{2}\rfloor}{2}\rfloor}{\lfloor\frac{\lfloor\frac{n}{2}\rfloor}{2}\rfloor}\times \binom{\lfloor\frac{n}{2}\rfloor\bmod 2}{\lfloor\frac{n}{2}\rfloor\bmod 2}\times\binom{n\bmod 2}{m\bmod 2}\equiv \cdots\pmod 2 (mn)(2n2n)×(mmod2nmod2)(22n22n)×(2nmod22nmod2)×(mmod2nmod2)(mod2)
你发现 n   m o d   2 n\bmod 2 nmod2 其实就是 n n n 二进制下第 0 0 0 位;

⌊ n 2 ⌋ \lfloor\dfrac{n}{2}\rfloor 2n 就是 n n n 右移一位, ⌊ n 2 ⌋   m o d   2 \lfloor\dfrac{n}{2}\rfloor\bmod 2 2nmod2 就是 n n n 二进制下第 1 1 1 位;

……

所以如果我们记 ( n ) k (n)_k (n)k 表示 n n n 二进制下第 k k k 位,那么:(设 n , m n,m n,m 最高位为第 K K K 位)
( n m ) ≡ ( ( n ) K ( m ) K ) ⋯ ( ( n ) 1 ( m ) 1 ) ( ( n ) 0 ( m ) 0 ) ( m o d 2 ) \binom{n}{m}\equiv\binom{(n)_K}{(m)_K}\cdots\binom{(n)_1}{(m)_1}\binom{(n)_0}{(m)_0}\pmod 2 (mn)((m)K(n)K)((m)1(n)1)((m)0(n)0)(mod2)
所以 ( n m ) ≡ 1 ( m o d 2 ) \dbinom{n}{m}\equiv 1\pmod 2 (mn)1(mod2) 当且仅当 ∀ i ∈ [ 0 , K ] , ( ( n ) i ( m ) i ) = 1 \forall i\in [0,K],\dbinom{(n)_i}{(m)_i}=1 i[0,K],((m)i(n)i)=1

又由于 ( n ) i , ( m ) i ∈ { 0 , 1 } (n)_i,(m)_i\in\{0,1\} (n)i,(m)i{0,1},手摸可知 ( 0 0 ) = ( 1 0 ) = ( 1 1 ) = 1 \dbinom{0}{0}=\dbinom{1}{0}=\dbinom{1}{1}=1 (00)=(01)=(11)=1 ( 0 1 ) = 0 \dbinom{0}{1}=0 (10)=0,发现恰好前三个都满足 ( n ) i bitand ⁡    ( m ) i = ( m ) i (n)_i\operatorname{bitand}\;(m)_i=(m)_i (n)ibitand(m)i=(m)i,所以条件等价于 n bitand ⁡ m = m n\operatorname{bitand}m=m nbitandm=m

证毕。

#include<bits/stdc++.h>

using namespace std;

inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=(x<<1)+(x<<3)+(ch^'0');
		ch=getchar();
	}
	return x*f;
}

int t,n,m;

int main()
{
	t=read();
	while(t--)
	{
		n=read(),m=read();
		if(!m)
		{
			puts(n?"0":"1");
			continue;
		}
		if(!n||m>n)
		{
			puts("0");
			continue;
		}
		if(!(m&1)) n--,m--;
		int a=n-m,b=(m+1)/2;
		int nn=a+b-1,mm=b-1;
		puts((nn&mm)==mm?"1":"0");
	}
	return 0;
}
  • 0
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值