大きいグループの合数の末尾のゼロの個数を知っていますか.


/*問題説明:組合せ数C(n,m)=nを求める!/(((n-m)!)*m!)中末尾に何個のゼロがありますか.
入力:tは入力されたテストデータのグループ数を表し、各caseは1行n,mの2つの数を含み、ここで(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
    "
    );  
  25.         }  
  26.         else if(num2>=num5)  
  27.         {  
  28.             printf("%ld
    "
    ,num5);  
  29.         }  
  30.         else 
  31.         {  
  32.             printf("%ld
    "
    ,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.     }