1 条题解

  • 2
    @ 2026-3-22 21:16:17

    一个数学知识,阶乘 0 的个数取决于这个阶乘中质因子 5 的个数,因为 2*5 才是 10,而 2 的数量肯定比我多。

    然后一个 x!,怎么快速求 5 的个数呢: ⌊n/5⌋ → 5的倍数的个数,每个贡献1个5 ⌊n/25⌋ → 25的倍数的个数,额外再贡献1个5 ⌊n/125⌋ → 125的倍数的个数,额外再贡献1个5 ... 总和 = ⌊n/5⌋ + ⌊n/25⌋ + ⌊n/125⌋ + ... 就是代码中 check 部分了

    最后要注意,求的是最小的x,那么x一定是5的倍数,为什么自己想

    #include <bits/stdc++.h>
    using namespace std;
    using ll= long long;
    ll k;
    
    ll check (ll x)
    {
        ll sum=0;
        while(x/5)
        {
            sum+=x/5;
            x/=5;
        }
        if (sum<k)
        return 2;
        return sum==k;
    }
    
    int main()
    {
        ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
        cin>>k;
        ll l=k*3,r=k*5+1;
        while(l+1!=r)
        {
            ll mid=l+r>>1;
            if (check(mid))
            l=mid;
            else r=mid;
        }
        if (check(l)==2)
        cout<<-1;
        else if (l%5==0)
        cout<<l;
        else
        {
            l-=l%5;
            cout<<l;
        }
    }
    

    信息

    ID
    115
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    58
    已通过
    26
    上传者