链接: link.
题面:一个字符串s, 可分成任意多个非空串, 求总和。
思路:暴力, 枚举2^(|s| - 1), 对于s < 2 * 1e5肯定过不了
2 * 1e5 是经典二分数据范围。(但这题不用二分, 而是快速幂);
so, 认真再分析一下。
设s = oooo (不失一般性);
+号位置 有
o # o # o # o
可以放三个#号位置上
考虑s每个数位对答案的贡献
自然而然想到
设当前位数为k
则
s[k] = (1 / 2^0 + 10 /2^1 + 1e2 / 2 ^ 2 + 1e3 */2 ^ 3 + … + 1e(k - 2) / 2^(k -1) + 1e(k - 1) /(k - 1) ;
so 注意一下过程就好了;
long long ans = 0, now = 0, del = 1;
for (int i = s.size() - 1; i >= 0; i--) {
now += del; now %= mod;
long long ce = (del + now) % mod;
ans += ce * (s[i] - '0'); ans %= mod;
del *= 5; del %= mod;
}
ans *= power(2, s.size() - 2);
ans %= mod;
cout << ans << endl;