[CP / Codeforces] C. Vlad and a Sum of Sum of Digits
C. Vlad and a Sum of Sum of Digits
分析
在给定的数据规模下,可以直接暴力计算出每个数的数位之和,求出前缀和后就可以在 \(O(1)\) 的时间复杂度下返回答案,因为数位拆分的时间复杂度为 \(O(nlogn)\),所以总的时间复杂度为 \(O(nlogn+t)\),其中 \(t\) 为查询次数。
事实上,并没有必要暴力计算出所有的数位之和,举个例子:
\[\textcolor{red}{12}3=\textcolor{red}{12}\times{}10+\textcolor{blue}{3}
\]
对应
\[6=3+3
\]
假设我们将 \(k\) 的数位之和存放在数组 \(dp[k]\) 中,根据上面的例子,可以得到递推式
\[dp[k]=dp[k/10]+k\ mod\ 10
\]
这样一来就能将 \(O(nlogn)\) 优化成 \(O(n)\)。
代码(\(O(n+t)\))
#define N 200005
int pre[N];
void preprocess() {
std::vector<int> dp(N);
for (int i = 1; i < N; i++) {
dp[i] = dp[i / 10] + i % 10;
pre[i] = pre[i - 1] + dp[i];
}
}
void solve() {
int n;
std::cin >> n;
std::cout << pre[n] << '\n';
}