勤劳的ACgirls

原题:勤劳的ACgirls

原题大意

zjc的ACgirls队的队员最近比较忙,为了能够取得更好的比赛成绩,他们制定了一个m天a掉n题的计划,a掉一题可以是这m天的任何时候。
为了表示对acmer事业的热爱,队长wc要求每天必须至少要ac掉k题,这m天每天ac掉的题数可以用一个m元组表示。
设不同的m元组一共有c个,请问c的末尾有多少个0?(如果c是0,输出0)

算法分析

用隔板法算出答案是C(n+(1-k)*m-1,m-1),然后算出因子5和因子2的个数,取小的那个

程序代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll m, n, k;
int main(){
    while(scanf("%lld%lld%lld", &m, &n, &k) != EOF){
        ll x = m - 1;
        ll y = (n - m * k) + m - 1;
        ll ans = 0;
        if(x > y || y <= 0){printf("%lld\n", ans);continue;}
        ll cnt2 = 0, cnt5 = 0;
        for(ll i = 2; i <= y; i*=2){
            cnt2 += y/i-(y-x)/i-x/i;
        }
        for(ll i = 5; i <= y; i*=5){
            cnt5 += y/i-(y-x)/i-x/i;
        }
        ans = min(cnt2, cnt5);
        printf("%lld\n", ans);
    }

    return 0;
}