Solution -「CF520E」Pluses everywhere
Step 1.
转化一步题目:考虑有 \(n\) 个小球,每个小球有 \(a_i\) 的价值,\(m\) 个板子,把板子插进小球间的空隙,且不能插在第 \(1\) 个球之前与第 \(n\) 个球之后。
且规定对于任意一个方案,若第 \(i\) 个球与下一块板子间相隔 \(j\) 个球,则该球对答案的贡献为 \(10^j a_i\)。现需要求出每一个方案每一个球的贡献和。
这题显然和原题是等价的(转化可能是因为它更组合一些 www),因为对于任意一个方案中的任意一个数字来说,只有它和下一个加号之间的数的个数会影响它对总答案的贡献。
于是我们考虑上面那个问题的答案。
对于第 \(i\) 个球,我们枚举 \(j\),并尝试求出会有多少方案使得目前的状态成立。可以发现 \(0 \leq j \leq n - i\)。
可以明确第 \(i\) 个球后的 \(j\) 个球之间都不能再插板,且第 \(j\) 个球和第 \(j + 1\) 个球之间一定需要插板、总共有 \(n - 1\) 个位置可以插板。那么也就是说总方案应该是在剩下的 \(n - 1 - j - 1\) 个空位中插 \(m - 1\) 个板的方案数,即 \(\dbinom {n - j - 2} {m - 1}\)。
特殊的,如果 \(j = n - i\),则柿子会有所改变。因为第 \(n\) 个球后不能插板,所以说可以转化为在 \(i\) 以前的能插的位置中插入 \(m\) 个板的方案,即 \(\dbinom {i - 1} {m}\)。
显然当前状态的第 \(i\) 个球的贡献应是 \(10^j a_i\),故总答案为 \({\large \sum \limits _{i = 1}^{n}} {\large \sum \limits _{j = 0}^{n - i - 1}} \dbinom {n - j - 2} {m - 1} 10^j a_i + {\large \sum \limits _{i = 1}^{n}} \dbinom {i - 1} {m} 10^{n - i} a_i\)。
这是 \(O(n^2)\) 的求解过程,不能通过,于是考虑优化。
Step 2.
你会发现,如果我们,确定了 \(j\),则我们也可以确定有多少 \(i\),可以得到该 \(j\) 的贡献,具体来讲,对于一个 \(j\),所有 \(1 \leq i \leq n - j\),都能得到 \(j\) 的贡献,因为这些球的后面都有 \(j\) 个球可以用于隔开自己和下一个加号。
当然这里仍需要考虑当前球后面都不再放加号的特殊情况,仍是单拎出来计算。
于是就可以直接来枚举 \(j\)。记 \(S(x) = {\large \sum \limits _{i = 1}^{x}} a_i\),则答案可写为 \({\large \sum \limits _{j = 0}^{n - 1}} 10^jS(n - j - 1)\dbinom {n - i - 2} {m - 1} + {\large \sum \limits _{i = 1}^{n}} \dbinom {i - 1} {m} 10^{n - i} a_i\)。
提前初始化组合数、\(10\) 的次方都是基本功了嘛。
Code.
#include <cstdio>
typedef long long LL;
int Abs(int x) { return x < 0 ? -x : x; }
int Max(int x, int y) { return x > y ? x : y; }
int Min(int x, int y) { return x < y ? x : y; }
int read() {
int x = 0, k = 1;
char s = getchar();
while(s < '0' || s > '9') {
if(s == '-')
k = -1;
s = getchar();
}
while('0' <= s && s <= '9') {
x = (x << 3) + (x << 1) + (s ^ 48);
s = getchar();
}
return x * k;
}
void write(int x) {
if(x < 0) {
x = -x;
putchar('-');
}
if(x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
void print(int x, char s) {
write(x);
putchar(s);
}
const int mod = 1e9 + 7;
const int MAXN = 1e5 + 5;
char s[MAXN];
int fac[MAXN], inv[MAXN], q[MAXN], p[MAXN], sum[MAXN];
inline int Sub(int x) { return x < 0 ? x + mod : x; }
inline int Plus(int x) { return x >= mod ? x - mod : x; }
inline int C(int n, int m) {
if(n < m)
return 0;
return (LL)fac[n] * inv[m] % mod * inv[n - m] % mod;
}
void init() {
inv[1] = 1;
for(int i = 2; i < MAXN; i++)
inv[i] = (LL)(mod - mod / i) * inv[mod % i] % mod;
fac[0] = 1, inv[0] = 1, p[0] = 1;
for(int i = 1; i < MAXN; i++) {
p[i] = (LL)p[i - 1] * 10 % mod;
fac[i] = (LL)fac[i - 1] * i % mod;
inv[i] = (LL)inv[i - 1] * inv[i] % mod;
}
}
int main() {
init();
int n = read(), m = read();
scanf ("%s", s + 1);
for(int i = 1; i <= n; i++) {
q[i] = s[i] - '0';
sum[i] = Plus(sum[i - 1] + q[i]);
}
int ans = 0;
for(int i = 0; i < n; i++)
ans = Plus(ans + (LL)sum[n - i - 1] * p[i] % mod * C(n - i - 2, m - 1) % mod);
for(int i = 1; i <= n; i++)
ans = Plus(ans + (LL)q[i] * p[n - i] % mod * C(i - 1, m) % mod);
print(ans, '\n');
return 0;
}
Solution -「CF520E」Pluses everywhere的更多相关文章
- Solution -「构造」专练
记录全思路过程和正解分析.全思路过程很 navie,不过很下饭不是嘛.会持续更新的(应该). 「CF1521E」Nastia and a Beautiful Matrix Thought. 要把所有数 ...
- Solution -「原创」Destiny
题目背景 题目背景与题目描述无关.签到愉快. 「冷」 他半靠在床沿,一缕感伤在透亮的眼眸间荡漾. 冷见惆怅而四散逃去.经历嘈杂喧嚣,感官早已麻木.冷又见空洞而乘隙而入.从里向外,这不是感官的范畴. 他 ...
- Solution -「GLR-R2」教材运送
\(\mathcal{Description}\) Link. 给定一棵包含 \(n\) 个点,有点权和边权的树.设当前位置 \(s\)(初始时 \(s=1\)),每次在 \(n\) 个结点内 ...
- Solution -「WF2011」「BZOJ #3963」MachineWorks
\(\mathcal{Description}\) Link. 给定你初始拥有的钱数 \(C\) 以及 \(N\) 台机器的属性,第 \(i\) 台有属性 \((d_i,p_i,r_i,g_i ...
- Solution -「LOCAL」二进制的世界
\(\mathcal{Description}\) OurOJ. 给定序列 \(\{a_n\}\) 和一个二元运算 \(\operatorname{op}\in\{\operatorname{ ...
- Solution -「SHOI2016」「洛谷 P4336」黑暗前的幻想乡
\(\mathcal{Description}\) link. 有一个 \(n\) 个结点的无向图,给定 \(n-1\) 组边集,求从每组边集选出恰一条边最终构成树的方案树.对 \(10^9+ ...
- Solution -「LOCAL」大括号树
\(\mathcal{Description}\) OurTeam & OurOJ. 给定一棵 \(n\) 个顶点的树,每个顶点标有字符 ( 或 ).将从 \(u\) 到 \(v\) ...
- Solution -「ZJOI2012」「洛谷 P2597」灾难
\(\mathcal{Description}\) link. 给定一个捕食网络,对于每个物种,求其灭绝后有多少消费者失去所有食物来源.(一些名词与生物学的定义相同 w.) 原图结点数 \ ...
- Solution -「JSOI2008」「洛谷 P4208」最小生成树计数
\(\mathcal{Description}\) link. 给定带权简单无向图,求其最小生成树个数. 顶点数 \(n\le10^2\),边数 \(m\le10^3\),相同边权的边数不 ...
随机推荐
- kill -9 进程杀不掉,怎么办?
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 用ps和grep命令寻找僵尸进程 ps -A -ostat,ppid,pid,cmd | gr ...
- 超越OpenCV速度的MorphologyEx函数实现(特别是对于二值图,速度是CV的4倍左右)。
最近研究了一下opencv的 MorphologyEx这个函数的替代功能, 他主要的特点是支持任意形状的腐蚀膨胀,对于灰度图,速度基本和CV的一致,但是 CV没有针对二值图做特殊处理,因此,这个函数对 ...
- H5如何实现唤起APP
前言 写过hybrid的同学,想必都会遇到这样的需求,如果用户安装了自己的APP,就打开APP或跳转到APP内某个页面,如果没安装则引导用户到对应页面或应用商店下载.这里就涉及到了H5与Native之 ...
- 使用python获取交换机syslog日志并使用jQuery在html上展示
需求 现网有部分pop点独立于海外,无法发送日志给内网日志服务器,同时最近网内有比较重要割接,所以临时写一个脚本来展示网内日志 思路 使用socket接收syslog数据,udp 514,数据部分格式 ...
- Jdbc从入门到入土
二刷jdbc 作者小结:从第一次大概几天快速刷完jdbc,到如今的二刷,才发现自己对jdbc的理解有点太浅.到学习javaweb是创建数据库层时的迷茫,到现在对这种设计模式的理解.我深有体会到了:实打 ...
- 安装Zabbix到Ubuntu(APT)
运行环境 系统版本:Ubuntu 16.04.2 LTS 软件版本:Zabbix-4.0.2 硬件要求:无 安装过程 1.安装APT-Zabbix存储库 APT-Zabbix存储库由Zabbix官网提 ...
- 【单片机】CH32V103C8T6定时器3程序实验
代码功能:每隔1毫秒进入一次定时器中断. 每隔1秒串口打印一次数据. time.c #include "time.h" #include "ch32v10x.h" ...
- HYPERMESH-NASTRAN梁的方向与偏置
Nastran关于梁的定义 我们知道,在定义梁单元时,一般需要定义单元的方向,或者说是单元的局部坐标系.对于Nastran内CBAR单元来说,梁轴向为X方向,我们需要给出向量\(\overrighta ...
- DirectX11 With Windows SDK--19(Dev) 编译Assimp并加载模型、新的Effects框架
前言 注意:这一章进行了重写,对应教程Dev分支第19章的项目,在更新完后面的项目后会替换掉原来第19章的教程 在前面的章节中我们一直使用的是由代码生成的几何模型,但现在我们希望能够导入模型设计师生成 ...
- 六、LVM和从磁盘配额
一.LVM概述 Logical Volume Manager,逻辑卷管理 优点:能够保证在现有数据不变的情况下,动态调整磁盘容量,从而提高磁盘管理的灵活性 /boot分区用于存放引导文件,不能基于LV ...