题目链接

题目翻译:

有时候想在讲价上达成一致不是一件容易的事。现在Sasha和Vova就没法达成一致:Sasha出了一个尽可能高的价格,然后Vova想要从中去除尽可能多的数字。说得更详细一些,Sasha出了一个价格整数n,Vova去除价格中的一段(连续的)非空子串,剩余的数字再组合在一起,结果就是最终的价格。
比如,Sasha出价1213121,Vova可以去除子串1312,结果就是121
结果允许有前导零。如果Vova去除所有的数字,最终的结果就是0。
Sasha想要提出一些限制,让Vova不能移除所有的数字,但他需要一些论据来支持这些限制。首先,他想要计算出所有被Vova移除之后的可能结果的总和。
因为答案会非常大,输出对109+7取余的结果。

解题思路:

我们可以对每一个数字逐个讨论,对于数字3,如果其有对最终结果做出贡献(即没有被去除的情况下),则有两种情况:①被去除的子串在3之前;②被除去的子串在3后面。
· 如果是第①种情况,3所占的位数始终是不变的,都是千位。共有6种可能:

其中数字3做出的贡献就是3000×6=18000。而这个6是怎么来的呢?显然就是3+2+1=6。总结一下就是,对于下标为i(下标从0开始,从后往前遍历,总长设为len)的数字,第①种情况共有(len-i)*(len-i-1)/2种可能,做出的贡献为(s[i]-'0')*pow(10,i)*(len-i)*(len-i-1)/2,其中s是Sasha给出的价格,为字符串类型。
· 如果是第②种情况,同样有6种可能:

数字3做出的贡献就是3×(3×100+2×10+1)=3×321=963。看着似乎也有些规律,来分析一下:如果一开始数字3后面有四个数,那么原式中的321就会变成4321。因此我们可以用变量tmp来保存当前的要乘以的数,那么相对于下标为i的数字,做出的贡献为(s[i]-'0')*tmp,而每次循环之后tmp如何变化,下面再讲。
这样我们就可以计算出每个数字对结果的贡献。但是还有一个问题,Sasha给出的价格的范围为1≤n<1010^5,根本没法计算,比如在第①种情况,(s[i]-'0')*pow(10,i)*(len-i)*(len-i-1)/2中的pow(10,i)直接挂掉。这个时候我们就要对一些像10,100,1000之类的数字先做一遍取余,保存在数组f中,f[i]就表示pow(10,i)取余之后的结果,这样代码就会变成(len-i)*(len-i-1)/2%MOD*f[i]*(s[i]-'0')%MOD;。而在第②种情况,tmp显然也会挂掉,所以每次在更新tmp的时候,也要对tmp进行取余。而tmp要如何变化呢?答案就是temp=((i+1)*f[i]%MOD+temp)%MOD;,想象从3214321的过程,你一定能看懂这段代码。

代码:
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<cstdio>
#include<cmath>
#define inf 0x3f3f3f3f
using namespace std;
const int N = 1e5+10,MOD = 1e9+7;
string s;
long long len,ans=0,temp=0,f[N],ans1=0,ans2=0;
int main(){//  freopen("1.txt","r",stdin);cin>>s;len=s.size();reverse(s.begin(),s.end());f[0]=1,f[1]=10;for(int i=2;i<N;i++){f[i]=(f[i-1]*10)%MOD;} for(int i=0;i<s.size();i++){ans1=(len-i)*(len-i-1)/2%MOD*f[i]*(s[i]-'0')%MOD;ans2=(s[i]-'0')*temp%MOD;temp=((i+1)*f[i]%MOD+temp)%MOD;ans+=(ans1+ans2)%MOD;ans%=MOD;}cout<<ans<<endl;return 0;
}
总结:

这题没做出来,一直感觉就差一点点,最后一直runtime error。比赛后又交了,结果TLE,看来思路都是错的。后来看了一些博客,感觉自己肯定不会,也不会想明白。最后还是硬着头皮写了出来,毕竟写了这么久,不AC怎么行。

参考博客:

Codeforces Round #675 (Div. 2) C - Bargain (推导)
感谢这位博主,在我想放弃这题的时候给了我希望。

codeforces Round #675 (Div. 2) 1422C Bargain相关推荐

  1. Codeforces Round #675 (Div. 2) F. Boring Queries 区间lcm + 主席树

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的序列aaa,qqq个询问,每次询问[l,r][l,r][l,r]内的lcmlcmlcm是多少,对1e9+71e9+71e9+7取模. n ...

  2. Codeforces Round #675 (Div. 2)——F主席树待补?

    A - Fence 把凑得那条边当成最长的边,如果a+b+c=d那么将会共线,只要稍微a+b+c大一点即可满足四边形. #define IO ios::sync_with_stdio(false);c ...

  3. Codeforces Round #456 (Div. 2)

    Codeforces Round #456 (Div. 2) A. Tricky Alchemy 题目描述:要制作三种球:黄.绿.蓝,一个黄球需要两个黄色水晶,一个绿球需要一个黄色水晶和一个蓝色水晶, ...

  4. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  5. Codeforces Round #563 (Div. 2)/CF1174

    Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...

  6. 构造 Codeforces Round #302 (Div. 2) B Sea and Islands

    题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...

  7. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...

  8. Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #712 Div.2(A ~ F) 题解 比赛链接:https:// ...

  9. Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...

最新文章

  1. python进程监控 supervisor_python supervisor进程监控工具的使用
  2. MPB:北林张静等-丛枝菌根真菌(AMF)孢子、菌丝密度及侵染率定量测定方法
  3. python数据分析常用包_python可视化数据分析常用图大集合(收藏)
  4. python基础之协程,列表生成式,生成器表达式
  5. 使用java底层实现邮件的发送(含测试,源码)
  6. linux上查看gitlab日志,如何查看Gitlab的版本?
  7. 给书配代码-电力经济调度(3):计及网络安全约束的经济调度模型
  8. java修饰符总结,java访问修饰符总结
  9. JDBC + SAP云平台 = 运行在云端的数据库应用
  10. (转)为Ubuntu安装翻译词典(星际译王)
  11. LeetCode(181)——超过经理收入的员工(MySQL)
  12. html 压缩工具 html-minifier
  13. 最大子段和(动态规划算法)
  14. 虚拟计算机累加乘法,乘法指令之: MLA乘-累加指令
  15. 使用CMD隐藏文件夹
  16. 记录微信分享图标不显示的问题
  17. python初学火车座位判断_初学Python实现学校图书馆座位自动抢座预约
  18. Kali Linux 秘籍 第九章 无线攻击
  19. 【Unity面试】 C#语言基础核心 | 面试真题 | 全面总结 | 建议收藏
  20. 纪念达尔文:进化论的美丽证据

热门文章

  1. 单利 java_关于单利模式的几种实现方式
  2. 笔试题:字母序最小的序列的第一张卡片上数字
  3. C++:实现将摄氏度转换为华氏度
  4. 从网页中唤起桌面应用程序
  5. 德职计算机系校企合作,【计算机教育论文】校企合作高职计算机教育关系研究(共3119字)...
  6. 微信小程序登录获取不到头像和昵称解决办法!
  7. Vulnhub靶机:HACKER KID_ 1.0.1
  8. Java实现微生物增殖
  9. LMTools 不能启动
  10. 致MonoCats社群的一封信:邀请您与我们在以太坊开启新篇章