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;
}

 

posted @ 2020-04-27 13:50  Rogn  阅读(280)  评论(0编辑  收藏