题解 UVA1185 【Big Number】

题目链接:UVa1185

我们先考虑如何求\(n\)的位数

\(10^{x} = n\)

\(n\)的位数为\(x + 1\)

也就是\(|n| = (log_{10} n) + 1(|n|\)表示\(n\)的位数\()\)

这个很明显吧。感性理解一下

然后我们再考虑 \(|n * m|\)

\(|n * m| = |n| + |m|\)

回到问题

要求的是\(|\prod_{i = 1}^{n}i|\)

也就是$\sum_{i = 1}^{n}|i|
$

我们设\(ans[i]\)表示求\(i\)的阶乘的位数

那么\(ans[i + 1] = ans[i] + log_{10}i\)

我们可以先预处理出每个\(ans\)

然后\(O(1)\)输出

时间复杂度为\(O(1e9 + T)\)

\(Code:\)

#include <bits.stdc++.h>

const int MaxN = 100000000 + 10;

using namespace std;

inline int read() {
    int cnt = 0, opt = 1;
    char ch = getchar();

    for (; ! isalnum(ch); ch = getchar())
        if (ch == '-')  opt = 0;
    for (; isalnum(ch); ch = getchar())
        cnt = cnt * 10 + ch - 48;

    return opt ? cnt : -cnt;
}//快读优化

int n;
double ans[MaxN];

int main() {
    for (int i = 1; i <= Maxn; ++i)
        ans[i] = ans[i - 1] + log10(i);
    n = read();
    for (int i = 1; i <= n; ++i) {
        int x = read();
        printf("%d\n", (int)(ans[x] + 1));
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/chz-hc/p/12221295.html