C(m,n)是一个组合数
N!含有质因数2的个数,等于N减去N的二进制表示中1的个数。
假设m!中2因子个数为a,n!中2因子个数为b,(m-n)!中2因子个数为c,则显然有a>=(b+c);并且当a==b+c时,一定为奇,否则为偶。
#include <iostream>
using namespace std;
int getn(int n)
{
int a=n,ans=0;
while(a>0)
{
if(a&1)ans++;
a=a>>1;
}
return n-ans;
}
int main()
{
int n,m;
while(cin>>m>>n)
{ int t=getn(m-n);
m=getn(m);
n=getn(n);
if(m==t+n)
cout<<"ODD"<<endl;
else cout<<"EVEN"<<endl;
}
return 0;
}
本文介绍了一种快速判断组合数C(m,n)奇偶性的算法。通过计算m!, n! 和 (m-n)! 中2的因子个数,并利用位运算来确定最终结果的奇偶性。此方法避免了直接计算阶乘所带来的巨大数值运算。

2507

被折叠的 条评论
为什么被折叠?



