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; }
一步一步,永不停息