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

{ 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
题目描述 给定两个长度均为 $n$ 的数组 $A,B$,其中 $A$ 数组中的元素两两不同,$B$ 数组中元素也两两不同。 定义 $A$ 数组的第 $i$ 个元素为 $a_i$,$B$ 数组的第 $i$ 个元素为 $b_i$。定义一个四元组 $(i,j,k,l)$ 符合条件当且仅当 $1 \leq i < j \leq n$,$1 \leq k < l \leq n$,$$ a_i+b_j=k+l $$ 问有多少个符合条件的四元组。 输入 输入的第一行为一个整数 $n$,表示 $A$ 和 $B$ 数组的长度。 接下来 $n$ 行,第 $i$ 行包含两个整数 $A_i$ 和 $B_i$。 输出 输出一行,一个整数,表示符合条件的四元组个数。 输入样例 3 1 1 2 2 3 3 输出样例 6 提示 $1 \leq n \leq 1500$,$1 \leq A_i,B_i \leq 10^9$ 这一题要解符合条件的四元组。其中有一个直观的想法就是将四元组分类讨论,如下所示: $$a_i + b_j = k + l$$ 分类讨论,当 $i < k, j < l$ 时就是一种方案,当 $i > k, j > l$ 时是另一种情况。 因此,对于每一种 $a_i + b_j$ 的和,记录下它的出现次数,同时记录下这个和所对应的 $i, j$ 的值。在计算的过程中,如果遇到相同的和的时候,再次遇到时是可以直接忽略的,因为等式是对称的。 统计符合条件的四元组当然要对和进行枚举,但是值得注意的是,在构造符合条件的 $k, l$ 的时候,数组 $C$ 和 $D$ 的记录顺序是无关紧要的,因为等式 $a_i + b_j = k + l$ 已经将每个数字都制约了,它们可以出现任意的顺序。因此,在统计 $C$ 和 $D$ 对于计算答案来说是无区别的。 这一题值得特别注意的是,当数组中有数据的时候,要注意考虑到数据越界可能导致结果错误。在本题中,由于 $a_i, b_j$ 的上限是 $10^9$,因此 $a_i + b_j$ 的上限最大可能会达到 $2 \times 10^9$,因此在计算时一定要使用 long long 类型,否则很容易产生错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值