ARC061 C - たくさんの数式
目次
# 問題
https://atcoder.jp/contests/arc061/tasks/arc061_a
数字列が与えられるので、その任意の位置に任意の数だけを入れで出来るすべての数式の答えの和を求める問題.
# 解説
数字列の長さがと小さいので、bit全探索で計算ステップ数はと十分間に合う.
数字列を再帰的に先頭一文字と残りに分割していき、その合計を求める.
数え上げの漏れだけないように注意.
# 計算量
数字列の長さをとすると、
# 解答
#include <sstream>
string S;
void input() {
cin >> S;
}
Int dfs(string s) {
stringstream ss(s);
Int x = 0;
ss >> x;
if (s.length() == 1) return x;
loop(n,1,s.length()) {
string left = s.substr(0, n);
string right = s.substr(n);
stringstream ss2(left); Int leftNum = 0; ss2 >> leftNum;
Int rightNum = dfs(s.substr(n));
// i.e. 1 + 23
// 1 + 2 + 3
// Here '1 +' is added twice. (twice is the number of cases)
x += leftNum * pow(2, right.length()-1) + rightNum;
}
return x;
}
void solve() {
cout << dfs(S) << endl;
}
int main(void) {
input();
solve();
return 0;
}