【數學】組合數
阿新 • • 發佈:2018-12-30
【題目背景】
從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)); } }