codevs1504愚蠢的组合数 / RQNOJ愚蠢的组合数

1504 愚蠢的组合数

 

 时间限制: 2 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
 
 
 
题目描述 Description

最近老师教了狗狗怎么算组合数,狗狗又想到了一个问题。。。

狗狗定义C(N,K)表示从N个元素中不重复地选取K个元素的方案数。

狗狗想知道的是C(N,K)的奇偶性。

当然,这个整天都老是用竖式算123456789*987654321=?的人不会让你那么让自己那么轻松,它说:“N和K都可能相当大。”

但是狗狗也犯难了,所以它就找到了你,想请你帮他解决这个问题。

数据范围(高精度)

对于30% 的数据,n<=10^2 t<=10^4

对于50% 的数据,n<=10^3 t<=10^5

对于100%的数据,n<=10^8 t<=10^5

输入描述 Input Description

第1行:一个正整数t,表示数据的组数。

第2~2+t-1行:两个非负整数N和K。(保证k<=n)

输出描述 Output Description

每一组输入,如果C(N,K)是奇数则输出1,否则输出0。

样例输入 Sample Input

3

1 1

1 0

2 1

样例输出 Sample Output

1

1

0

数据范围及提示 Data Size & Hint

预备知识

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&k==k则c(n,k)为奇数

否则为偶数

那就很简单了

上代码!

还有一件事……

位运算要加括号!!!!!!!!!!!

括号!!!!!!!!!!!!!!!!

括号!!!!!!!!!!!!!!!!

 

 1 2  3  4 5 
 6 
 7 #include<iostream>
 8 #include<cstdio>
 9 using namespace std;
10 
11 int n,k;
12 int q;
13 
14 int main()
15 {
16 scanf("%d",&q);
17 while(q--)
18 {
19 scanf("%d%d",&n,&k);
20 if((n & k) == k)printf("1
");//一定要加括号,位运算的运算优先级小于等号
21 else    printf("0
");
22 }
23 return 0;
24 }
原文地址:https://www.cnblogs.com/kuaileyongheng/p/7065498.html