F - Problem where +s Separate Digits

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值