链接: 原题链接.
题面:一个字符串s, 可分成任意多个非空串, 求所有划分中每段字符串看成数字的和。
思路:暴力, 枚举
2
∣
s
∣
−
1
2^{|s| - 1}
2∣s∣−1, 对于
s
≤
2
∗
1
e
5
s \leq 2 * 1e5
s≤2∗1e5 虽然铁铁超时,但给了我们一个计算每个数位贡献的思路
S
o
So
So, 认真再分析一下。
设
s
s
s = “oooo” (不失一般性);
+号位置 有
o # o # o # o
可以放三个#号位置上
考虑s每个数位对答案的贡献
自然而然想到
设当前位数为k
则
s
k
=
(
1
0
0
2
0
+
1
0
1
2
1
+
.
.
.
+
1
0
k
−
1
2
k
−
1
)
s_k = (\frac{10^0}{2^0} + \frac{10^1}{2^1} + ... + \frac{10^{k-1}}{2^{k-1}})
sk=(20100+21101+...+2k−110k−1) 即
S
k
=
∑
i
=
0
k
−
1
1
0
i
2
i
S_k = \sum_{i=0}^{k-1}\frac{10^i}{2^i}
Sk=∑i=0k−12i10i
C o d e Code Code
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;