/*
问题描述:求组合数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
*/
- #include <stdio.h>
- #include <math.h>
- long count2(long);
- long count5(long);
- int main(int argc, char *agrv[])
- {
- int t;
- long n,m;
- long num2,num5;//组合数中含有因子2的个数为num2,还有因子5的个数为num5
- scanf("%d",&t);
- while(t--)
- {
- scanf("%d%d",&n,&m);
- num2=count2(n);
- num2-=count2(m);
- num2-=count2(n-m);
- num5=count5(n);
- num5-=count5(m);
- num5-=count5(n-m);
- if(0==num2||0==num5)
- {
- printf("0\n");
- }
- else if(num2>=num5)
- {
- printf("%ld\n",num5);
- }
- else
- {
- printf("%ld\n",num2);
- }
- };
- }
- //统计n!中含有多少个因子2
- long count2(long n)
- {
- double n1=log(n)/log(2);//换底公式,这一求出log2(n)
- long max=(long)n1;
- return max*(max-1)/2;
- }
- //统计n!中含有多少个因子5
- //感谢rangercyh童鞋为count5提供的算法思想
- long count5(long n)
- {
- long a=0;
- if(n>=5)
- {
- n/=5;
- a+=n;
- return a;
- }
- else
- {
- return 0;
- }
- }
转载于:https://blog.51cto.com/charlesxie/463255