[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';
}
posted @ 2024-02-20 15:46  ZXPrism  阅读(31)  评论(0)    收藏  举报