CSU1021-组合数末尾的零-打表、模拟
2017-06-26 00:05
316 查看
F: 组合数末尾的零
Description
从m个不同元素中取出n (n ≤ m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数。组合数的计算公式如下:C(m, n) = m!/((m - n)!n!)
现在请问,如果将组合数C(m, n)写成二进制数,请问转这个二进制数末尾有多少个零。
Input
第一行是测试样例的个数T,接下来是T个测试样例,每个测试样例占一行,有两个数,依次是m和n,其中n≤ m≤ 1000。Output
分别输出每一个组合数转换成二进制数后末尾零的数量。Sample Input
2 4 2 1000 500
Sample Output
1 6
我的思路就是预处理出每个数转成2进制后末尾的零数,然后把组合数分子分母的0的个数相减就好
顺便这个预处理思路我觉得还是值得一吹的,虽然不知道有没有更高效的
#include <bits/stdc++.h> #define LL long long #define ULL unsigned long long #define mem(a,n) memset(a,n,sizeof(a)) #define fread freopen("in.txt","r",stdin) #define fwrite freopen("out.txt","w",stdout) #define N 10100 #define INF 0x3f3f3f3f #define eps 1e-9 using namespace std; int zero[1054]; int main() { ios::sync_with_stdio(false); int base=2; while(base<1000){ for(int i=base;i<1024;i+=base){ ++zero[i]; } base<<=1; } // for(int i=0;i<1024;++i){ // cout<<i<<' '<<zero[i]<<endl; // } int n,t,m,z; cin>>t; while(t--){ z=0; cin>>n>>m; if(m>n/2){ m=n-m; } for(int i=n-m+1;i<=n;++i){ z+=zero[i]; } for(int i=1;i<=m;++i){ z-=zero[i]; } cout<<z<<endl; } return 0; } /********************************************************************** Problem: 1021 User: CSUzick Language: C++ Result: AC Time:0 ms Memory:1692 kb **********************************************************************/
相关文章推荐
- CSU 1021 组合数末尾的零
- CSU 1021 从m个不同元素中取出n (n ≤ m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数。组合数的计算公式如下: C(m, n) = m!/((m - n)!n!) 现在请问,如果将组合数C(m, n)写成二进制数,请问转这个二进制数末尾有多少个零。
- CSUOJ 1021 组合数末尾的零 二进制
- csu 1021 组合数末尾的零(思路)
- 1021: 组合数末尾的零
- 1021: 组合数末尾的零
- csu 1021 (组合数末尾的0)
- CSU1977-Bit-reversal Permutation-模拟
- hdu5327 Olympiad(简单题:打表+模拟)
- 3.3-多个栈组合模拟一个栈
- zoj 3878【打表模拟】
- CSU1093-Caps Lock-模拟
- csu 1395: Timebomb (模拟)
- CSU1642-Problem B-前缀和数组/模拟
- [排列组合 + 分段打表] 51nod 算法马拉松25 A. 二分答案
- 编写代码模拟手机与SIM卡组合的关系
- POJ2886-Who Gets the Most Candies?-模拟约瑟夫环+反素数表(线段树上二分+爆搜打表)
- PHP面向对象之旅:接口与组合模拟多继承
- LightOJ 1005 - Rooks (组合数学dp模拟)
- csu1021