ZOJ 2022 Factorial (数学 思维)

题目:传送门

题意

输入 n (1 <= n <= 1000000000),问 n! 十进制形式末尾有多少个0;

思路

一般的思路就是,枚举 1 ~ n 中有多少个质因子 5 和 2,这样子做的复杂度是 o(nlogn)的,显然不行。

其实,我们只需要知道 1 ~ n 中,总共有多少个质因子 5 就好了,因为 2 肯定比 5 多。

那我们可以每次提取一个质因子 5,这样 1 ~ n 就变成了 1 ~ n / 5

那可以递归实现, f(n) = n / 5  + f(n / 5),用循环实现也可以。

#include <bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define UI unsigned int
#define mem(i, j) memset(i, j, sizeof(i))
#define rep(i, j, k) for(int i = j; i <= k; i++)
#define dep(i, j, k) for(int i = k; i >= j; i--)
#define pb push_back
#define make make_pair
#define INF 0x3f3f3f3f
#define inf LLONG_MAX
#define PI acos(-1)
#define fir first
#define sec second
#define lb(x) ((x) & (-(x)))
#define dbg(x) cout<<#x<<" = "<<x<<endl;
using namespace std;

const int N = 1e6 + 5;

void solve() {

    LL n;

    scanf("%lld", &n);

    LL ans = 0LL;

    while(n) {

        ans += n / 5;

        n /= 5;

    }

    printf("%lld\n", ans);

}

int main() {

    int _; scanf("%d", &_);
    while(_--) solve();

//    solve();

    return 0;
}

 

posted on 2020-05-13 11:33  Willems  阅读(146)  评论(0编辑  收藏  举报

导航