码迷,mamicode.com
首页 > 其他好文 > 详细

ZOJ 2022 Factorial (数学 思维)

时间:2020-05-13 11:43:53      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:传送门   i++   name   problems   ons   amp   get   tor   实现   

题目:传送门

题意

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

 

ZOJ 2022 Factorial (数学 思维)

标签:传送门   i++   name   problems   ons   amp   get   tor   实现   

原文地址:https://www.cnblogs.com/Willems/p/12881363.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!