4.26騰訊筆試題


共5題,其中某一題如下

題目:設設 n! 末尾0個個數為Q,現給出Q,求滿足條件的最小正整數n($1 \leq Q \leq 10^{18}$)

分析:

給出n求 n! 末尾0的個數,有規律:

ll func(ll n)
{
    ll res = 0;
    while(n >= 5)
    {
        n /= 5;
        res += n;
    }
    return res;
}

而且,Q關於n是單調的,即n越大,Q越大或不變,所以可以用二分。

注意,可能n不存在,例如Q=11。因為遇到50,500這種一次增加了多個0。

#include<iostream>
#include<cstdio>
using namespace std;

typedef long long ll;
ll x;

ll func(ll n)
{
    ll res = 0;
    while (n >= 5)
    {
        n /= 5;
        res += n;
    }
    return res;
}

void solve()
{
    ll l = 1, r = 1e18, mid;
    while (l < r)
    {
        mid = (l + r) >> 1;
        ll tmp = func(mid);
        if (tmp < x)  l = mid + 1;
        else if (tmp >= x)  r = mid;
    }
    if (func(r) != x)  cout << "No solution" << endl;   // check一次
    else  cout << r << endl;
}

int main()
{
    int T;
    cin >> T;
    while (T--)
    {
        cin >> x;
        solve();
    }
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM