1. 程式人生 > >【數學】組合數

【數學】組合數

【題目背景】

從m個不同元素中,任取n(n≤m)個元素併成一組,叫做從m個不同元素中取出n個元素的一個組合;從 m 個不同元素中取出 n(n≤m)個元素的所有組合的個數,叫做從 m 個不同元素中取出 n 個元素的組合數,記作 C(m,n)。
你的任務是:計算C(m,n)末尾有幾個0。如 C(10,1)=10,末位有一個

【輸入格式】

輸入檔名為 zero.in。
第一行一個數 T(<=1000),表示資料組數
對於每一組資料:輸入兩個數,m 和 n

【輸出格式】

輸出檔名為 zero.out。
對於每組資料輸出一行,包含一個數,表示 C(m,n)末尾有幾個 0


考慮對於C(m,n)的公式n!/(m!*(n-m)!)

考慮計算這些中2的因子的個數,5的因子的個數

進行加減法計算即可

#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
int t,n,m;
long long ans=0,ans2=0;
long long solve(int x)
{
	long long sum=0;
	while(x)
	{
		sum+=x/5;
		x/=5;
	}
	return sum;
}
long long solve2(int x)
{
	long long sum=0;
	while(x)
	{
		sum+=x/2;
		x>>=1;
	}
	return sum;
}
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		ans=0,ans2=0;
		scanf("%d%d",&n,&m);
		ans+=solve(n);
		ans2+=solve2(n);
		ans-=solve(m);
		ans-=solve(n-m);
		ans2-=solve2(m);
		ans2-=solve2(n-m);
		printf("%lld\n",min(ans,ans2));
	}
}