Σ[k=0..10^100]floor(X/10^k)
問題
E – Σ[k=0..10^100]floor(X/10^k)
プログラミング初級者から上級者まで楽しめる、競技プログラミングコンテストサイト「AtCoder」。オンラインで毎週開催プログラミングコンテストを開催しています。競技…
記録
- 2022/6/24 (少し遅いが)OK。
- 2021/12/25 リアルタイム参加。解法思いつかず。
解法
- \(X\) を1桁ずつ削った場合の総合計を求める問題。
- \(X\) を文字列として扱うが、下図のように \(1\) 桁ずつ見ていく。
- 最終的に出力する答えも文字列になるが、答えも大きいので文字列操作で
TLE
にならないよう気をつける。
コード例
#include <bits/stdc++.h> using namespace std; #include <atcoder/all> using namespace atcoder; using ll = long long; using P = pair<int, int>; #define rep(i, n) for(int i = 0; i < (n); ++i) // using mint = modint998244353; // using mint = modint1000000007; // const int mod = 1000000007; // const ll INF = 1LL << 60; // const int INF = 1001001001; int main() { string S; cin >> S; int sum = 0; int n = S.size(); vector<int> digit(n); rep(i, n) { digit[i] = (S[i] - '0'); sum += digit[i]; } vector<int> v; rep(i, n) { if(i == 0) { v.push_back(sum); } else { int d = digit[n - i]; sum -= d; v.push_back(sum); } } n = v.size(); string ans = ""; int current = 0; while(current < n) { int v1 = v[current]; if(n - current == 1) { string s1 = to_string(v1); reverse(s1.begin(), s1.end()); ans += s1; } else { int v2 = v[current + 1] * 10; int v3 = v1 + v2; v[current + 1] = v3 / 10; int v4 = v3 % 10; ans += to_string(v4); } current++; } n = ans.size(); for(int i = n - 1; 0 <= i; --i) { cout << ans[i]; } cout << endl; return 0; }