组合数

comb.c/cpp/pas
1s/128M
【题目描述】
最近老师教了小明怎么算组合数,小明又想到了一个问题。。。
小明定义C(N,K)表示从N个元素中不重复地选取K个元素的方案数。
小明想知道的是C(N,K)的奇偶性。
当然,这个整天都老是用竖式算123456789*987654321=?的人不会让你那么让自己那么轻松,它说:“N和K都可能相当大。”
但是小明也犯难了,所以它就找到了你,想请你帮他解决这个问题。
【输入描述】
输入文件:comb.in
第1行:一个正整数t,表示数据的组数。
第2~2+t-1行:两个非负整数N和K。(保证k<=n)
【输出描述】
输出文件:comb.out
对于每一组输入,如果C(N,K)是奇数则输出1,否则输出0。
【样例输入】
3
1 1
1 0
2 1
【样例输出】
1
1
0
【数据范围】
对于30% 的数据,n<=10^2 t<=10^4
对于50% 的数据,n<=10^3 t<=10^5
对于100%的数据,n<=10^8 t<=10^5
【预备知识】
C(n, 0) = C(n, n) = 1 (n > 0;)
C(n, k) = C(n − 1, k − 1) + C(n − 1, k) (0 < k < n)

题解
如果本题你还思维定式的用高精度计算,那你就完蛋了。(可以得部分分)
本题主要考察数学知识。
方法一:统计n!质因子中2的个数
n! = 2^a * M
a=[n/2]+[n/(2^2)]+[n/(2^3)]+ … +[n/(2^g)] (2^g<=n)
证明:加法原理
所以C(N,K)质因子中2的个数为 F = f(N) - f(K) - f(N - K)
若F大于0,则为偶数,等于零为奇数。
*方法二:由Lucas定理得当k==(k&n)时为奇数,否则为偶数。来源

#include<cstdio>
long long ans;
void freo(){
    freopen("comb.in","r",stdin);
    freopen("comb.out","w",stdout);
}
int T;
long long n,k;

int main(){
    freo();
    scanf("%d",&T);
    for(int t=1;t<=T;t++){
        scanf("%d%d",&n,&k);
        if(n&k==k)printf("1\n");
        else printf("0\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值