/*
问题描述:求组合数C(n,m)=n!/(((n-m)!)*m!)中末尾有多少个零


输入:输入t表示输入的测试数据的组数,其中每个case包含一行n,m两个数,其中(1<=m<=n<=10^9)

SAMPLE INPUT:
3
5 1
5 2
100 1
SAMPLE OUTPUT:
0
1
2
*/

 

 

 

 

 

 

 

 

 

 

 

 

 

 
  
  1. #include <stdio.h>  
  2. #include <math.h>  
  3.  
  4. long count2(long);  
  5. long count5(long);  
  6.  
  7. int main(int argc, char *agrv[])  
  8. {  
  9.     int t;  
  10.     long n,m;  
  11.     long num2,num5;//组合数中含有因子2的个数为num2,还有因子5的个数为num5  
  12.     scanf("%d",&t);  
  13.     while(t--)  
  14.     {  
  15.         scanf("%d%d",&n,&m);  
  16.         num2=count2(n);  
  17.         num2-=count2(m);  
  18.         num2-=count2(n-m);  
  19.         num5=count5(n);  
  20.         num5-=count5(m);  
  21.         num5-=count5(n-m);  
  22.         if(0==num2||0==num5)  
  23.         {  
  24.             printf("0\n");  
  25.         }  
  26.         else if(num2>=num5)  
  27.         {  
  28.             printf("%ld\n",num5);  
  29.         }  
  30.         else 
  31.         {  
  32.             printf("%ld\n",num2);  
  33.         }  
  34.     };  
  35.  
  36. }  
  37. //统计n!中含有多少个因子2  
  38. long count2(long n)  
  39. {  
  40.     double n1=log(n)/log(2);//换底公式,这一求出log2(n)  
  41.     long max=(long)n1;  
  42.     return max*(max-1)/2;  
  43. }  
  44. //统计n!中含有多少个因子5  
  45. //感谢rangercyh童鞋为count5提供的算法思想  
  46. long count5(long n)  
  47. {  
  48.     long a=0;  
  49.     if(n>=5)  
  50.     {  
  51.         n/=5;  
  52.         a+=n;  
  53.         return a;  
  54.     }  
  55.     else 
  56.     {  
  57.         return 0;  
  58.     }