题解 UVA1118 【Binary Stirling Numbers】

Link

双倍经验:Link

题意

{nm}mod2。多组数据。

1n,m109,1T200

思路

首先特判几个特殊情况

{n0}={0n}=[n=0]{nm}=0(n<m)

再来看递推式。{nm}=m{n1m}+{n1m1}

此时可以对 m 的奇偶性分类讨论。

  • 2|m

    {nm}{n1m1}(mod2)

  • 2m

    {nm}{n1m1}+{n1m}(mod2)

考虑建立平面直角坐标系,其中点 (n,m) 的值即为 {nm}mod2

考虑 {nm} 可从 {n1m1}{n1m} (当 2|m)转移至,考虑 m 只能由第一种转移增加,于是从 (0,0)(n,m) 的转移中第一种转移的次数为 m 次,那么第二种便转移了 nm 次。

相当于有 nm 个连续的第一种转移段,而可进行的第一次转移只有 d=m2 次,故

{nm}(nm+d1d1)(mod2)

即问题转化为组合数奇偶性问题。

根据 Lucas 定理,

(nm)(n2m2)×(nmod2mmod2)(mod2)

递归时我们发现每次都会将 n,m 去掉最后一位,若 n 二进制的第 i 位为 0m1 时,(nm)0(mod2),即(nm)1(mod2) 当且仅当 n and m=m

故原问题迎刃而解。

时间复杂度 O(T)

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
namespace IO{//by cyffff

}
int main(){
    int t=read();
    while(t--){
        int n=read(),m=read();
        if(!n&&!m) write(1);
        else if(!n||!m) write(0);
        else if(n<m) write(0);
        else{
            int d=m+1>>1;
            write((n-m+d-1&d-1)==d-1);
        }
        putc('\n');
    }
    flush();
    return 0;
}

再见 qwq~

posted @   ffffyc  阅读(185)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示