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) 收藏 举报
浙公网安备 33010602011771号