组合数末尾的零

组合数末尾的零

Description

m个不同元素中取出(≤ m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数。组合数的计算公式如下:

C(mn) = m!/((n)!n!) 

现在请问,如果将组合数C(mn)写成二进制数,请问转这个二进制数末尾有多少个零。

Input

第一行是测试样例的个数T,接下来是T个测试样例,每个测试样例占一行,有两个数,依次是mn,其中≤ ≤ 1000。

Output

分别输出每一个组合数转换成二进制数后末尾零的数量。

Sample Input

24 21000 500

Sample Output

16
数很大不能计算出m的组合数,将组合数的分子分母中所有2的因子分离出来,那么相除的结果中剩余的2的因子,也就是组合数2的因子,即末尾0的个数(二进制数末尾添加一个零就等于对该数乘二)
  1. #include <iostream>   
  2. using namespace std;  
  3. int solve(int n)  
  4. {  
  5.     int sum=0;  
  6.     for(int i=1;i<=n;i++)  
  7.     {  
  8.         int x=i;  
  9.         while(x)  
  10.         {  
  11.             if(x&1) break;  
  12.             sum++;  
  13.             x/=2;  
  14.         }  
  15.     }  
  16.     return sum;  
  17. }  
  18. int main()  
  19. {  
  20.     int T,n,m;  
  21.     scanf("%d",&T);  
  22.     while(T--)  
  23.     {  
  24.         scanf("%d %d",&n,&m);  
  25.         printf("%d\n",solve(n)-solve(n-m)-solve(m));  
  26.     }  
  27.     return 0;  
  28. }  
  1. #include<iostream>  
  2. using namespace std;  
  3. int C(int m,int n)  
  4. {  
  5.     int i,sum1=0,sum2=0,j;  
  6.     for(i=m,j=n;j>0;i--,j--)  
  7.     {  
  8.         int a=i;  
  9.         int b=j;  
  10.         while(a%2==0)  
  11.         {  
  12.             sum1++;  
  13.             a/=2;  
  14.         }  
  15.         while(b%2==0)  
  16.         {  
  17.             sum2++;  
  18.             b/=2;  
  19.         }  
  20.     }     
  21.         return sum1-sum2;  
  22.       
  23. }  
  24.           
  25.   
  26. int main()  
  27. {  
  28.     int T,m,n;  
  29.     cin>>T;  
  30.     while(T--)  
  31.     {  
  32.         cin>>m>>n;  
  33.         cout<<C(m,n)<<endl;  
  34.     }  
  35.     return 0;  
  36. }  


阅读更多
上一篇string用法
下一篇二分法修路
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭