F - Problem where +s Separate Digits(Upd:2023年3月21日21:36:08)

链接: 原题链接.
题面:一个字符串s, 可分成任意多个非空串, 求所有划分中每段字符串看成数字的和。
思路:暴力, 枚举 2 ∣ s ∣ − 1 2^{|s| - 1} 2s1, 对于 s ≤ 2 ∗ 1 e 5 s \leq 2 * 1e5 s21e5 虽然铁铁超时,但给了我们一个计算每个数位贡献的思路
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+...+2k110k1) 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=0k12i10i

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;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值