codevs1504愚蠢的组合数 / RQNOJ愚蠢的组合数
题目描述 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\n");//一定要加括号,位运算的运算优先级小于等号 21 else printf("0\n"); 22 } 23 return 0; 24 }