标签:etc 就是 要求 big math ret ace org problem
题目链接: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;
}
标签:etc 就是 要求 big math ret ace org problem
原文地址:https://www.cnblogs.com/chz-hc/p/12221295.html