笔试题 - 阶乘问题
生活随笔
收集整理的這篇文章主要介紹了
笔试题 - 阶乘问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題干:
【題意】
給你一個數組n(1<=n<=1e5)
讓你輸出有多少數的階乘后恰好有n個0,并依次輸出。
【類型】
二分or暴力
【分析】
肯定滿足,數字越大,其后的0的個數也就越多。
于是我們可以二分出最小的l,使得fac[l]>=n
同時我們二分出最大的r,使得fac[r]<=n
然后答案就是區間段[l,r]
而算fac[l]有多少個0,就是查看fac[l]中有多少個5
因為n不大,所以另外一種做法是暴力。
我們直接求出fac[i]的末尾有多少個0即可
【時間復雜度&&優化】
O(log(n)log(n)) or O(nlogn)
解題報告:
?
AC代碼:
#include<stdio.h> #include<iostream> #include<string.h> #include<string> #include<ctype.h> #include<math.h> #include<set> #include<map> #include<vector> #include<queue> #include<bitset> #include<algorithm> #include<time.h> const int N = 0, M = 0, Z = 1e9 + 7, ms63 = 0x3f3f3f3f; int n; int main() {while (~scanf("%d", &n)) {int l = 0;int r = 1e9;while (l < r) {int m = (l + r) >> 1;int five = 0;int tmp = m;while (tmp) {tmp /= 5;five += tmp;}if (five > n)r = m;else l = m + 1;}int R = l-1;l = 0;r = 1e9;while (l < r) {int m = (l + r) >> 1;int five = 0;int tmp = m;while (tmp) {tmp /= 5;five += tmp;}if (five < n)l = m + 1;else r = m;}int L = l;printf("%d\n", R - L + 1);for (int i = L; i <= R; ++i)printf("%d ", i);puts("");}return 0; } /**/?
總結
以上是生活随笔為你收集整理的笔试题 - 阶乘问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国内油价将迎年内最后一涨,这次调升后,“
- 下一篇: 【Hihocoder - offer编程