DestinHistoire

 

POJ-1430 Binary Stirling Numbers(数学+斯特林数)

题目描述

  判断第二类斯特林数 \(S(n,m)\) 的奇偶性(\(1\leq T\leq 200,1\leq m\leq n\leq 10^9\))。

  \(S(0,0)=1;S(n,0)=0(n>0);S(0,m)=0(m>0)\)

  \(S(n,m)=mS(n-1,m)+S(n-1,m-1)(n,m>0)\)

分析

  设 \(S^{\ast}(n,m)\)\(S(n,m)\) 在模 \(2\) 意义下的值。

  当 \(m\) 是偶数时,\(S^{\ast }(n,m)=S^{\ast }(n-1,m-1)\);当 \(m\) 是奇数时,\(S^{\ast}(n,m)=S^{\ast }(n-1,m)+S^{\ast }(n-1,m-1)=S^{\ast }(n-1,m)+S^{\ast }(n-2,m-2)\)

  因此递推式的结果与第 \(m\) 和第 \(m-2\) 列有关,打表,把列号为奇数的列单独拿出来看。

  第一列为 \(\dbinom{n}{0}\),第三列为 \(\dbinom{n-2}{1}\),第五列为 \(\dbinom{n-3}{2}\),归纳得到第 \(n\) 列为 \(\dbinom{n-\frac{m}{2}-1}{\frac{m+1}{2}-1}\)

  把行号为偶数的列单独拿出来看。

  第二列为 \(\dbinom{m-2}{0}\),第四列为 \(\dbinom{n-3}{1}\),第六列为 \(\dbinom{n-4}{2}\),归纳得到第 \(m\) 列为 $\dbinom{n-\frac{m}{2}-1}{\frac{m+1}{2}-1} $。

  因此当 \((n-\frac{m}{2}-1)\& (\frac{m+1}{2}-1)=n-\frac{m}{2}-1\) 时,\(S(n,m)\) 为奇数,否则为偶数(用Lucas 定理证明)。

代码

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    /*S[0][0]=1;
    for(int i=1;i<=100;i++)
        for(int j=1;j<=i;j++)
            S[i][j]=S[i-1][j-1]+j*S[i-1][j];
    for(int i=1;i<=100;i++)
    {
        for(int j=1;j<=i;j++)
        {
            if(j%2==0)
                S[i][j]=S[i-1][j-1];
            else
                S[i][j]=S[i-1][j]+S[i-1][j-1];
        }
    }
    for(int i=1;i<=20;i++)
    {
        if(i<=9)
            cout<<"n="<<i<<"  ";
        else
            cout<<"n="<<i<<" ";
        for(int j=1;j<=i;j+=2)
            cout<<S[i][j]<<" ";
        cout<<endl;
    }
    for(int i=1;i<=20;i++)
    {
        if(i<=9)
            cout<<"n="<<i<<"  ";
        else
            cout<<"n="<<i<<" ";
        for(int j=2;j<=i;j+=2)
            cout<<S[i][j]<<" ";
        cout<<endl;
    }*/
    int T;
    cin>>T;
    while(T--)
    {
        long long n,m;
        cin>>n>>m;
        if(m>n)
        {
            puts("0");
            continue;
        }
        else if(n==m)
        {
            puts("1");
            continue;
        }
        else if(n*m==0)
        {
            puts("0");
            continue;
        }
        long long x=n-m/2-1;
        long long y=(m+1)/2-1;
        if((x&y)==y)
            puts("1");
        else
            puts("0");
    }
    return 0;
}

posted on 2020-11-03 17:07  DestinHistoire  阅读(103)  评论(0)    收藏  举报

导航