ABC 171 F - Strivore 【容斥】
https://atcoder.jp/contests/abc171/tasks/abc171_f
题意
给你一个数 \(k\) ,一个字符串 \(s\) (只包含小写字母)
定义一次操作:把任意小写英文字母填入当前串的任意位置。问做完 \(k\) 次操作能得到多少不同的字符串?
思路
首先试着直接求出答案,那么就是往当前串的空隙里插入字符。
原字符串的空隙一共有 \(|S|\) 个。对于字符串原有的字符 \(s_i\) 来说,它会把它之后第一次出现的和 \(s_{i+1}\) 相同的字符当成 \(s_{i+1}\),所以除了最后一个空隙可以任意填(26种),原字符串的空隙可以填入的字符都是25种。
我的意思是 \(\sum_{i=0} ^ {k} 26^i * 25^{k - i} * C_{k - i + |S| - 1} ^ {|S| - 1}\) 。
然而可以证伪。
因为我的做法是对于同一个 \(i\),把所有的排列组合方案数和 \(25^{k - i}\) 相乘,可能会多算,例如 _a_b , 填入了aa,填在a之后就都可以,有填的a落在a之前就不可以 。
正解:
正难则反。
ans = \(26^{k + |S|}\) - 不包含 \(S\) 这个子序列的字符串方案数
check是否包含 \(S\) 这个子序列的方法:从字符串的第一个开始找,找到和 \(s_i\) 相同的字符串后,\(i\) += 1
新字符串可以包含 \(S\) 这个子序列的一个前缀 from 0 to |S| - 1
字符串的空隙间可以填入25种字符,由于不包含完整的 \(S\),字符串的末尾的空隙也只能填入25种字符
ans = \(26^{k + |S|} - \sum_{i = 0} ^ {|S| - 1} 25^{k + |S| - i} * C_{k + |S|} ^ {i}\)
code
思路清楚了,代码实现就比较简单了。
ll qpow(ll a, ll x) {
ll ans = 1;
while(x) {
if(x & 1) {ans *= a; ans %= mod;}
a *= a; a %= mod; x /= 2;
}
return ans;
}
void init(int n) {
fac[0] = 1;
for(int i = 1; i <= n; i++) {
fac[i] = fac[i - 1] * i % mod;
}
inv[n] = qpow(fac[n], mod - 2);
for(int i = n - 1; i >= 1; i--) {
inv[i] = inv[i + 1] * (i + 1) % mod;
}
inv[0] = 1;
}
ll C(int n, int m) {
if(n < m) return 0;
return fac[n] * inv[m] % mod * inv[n - m] % mod;
}
int main () {
init(2e6);
scanf("%d%s", &k, s + 1);
n = strlen(s + 1);
ll ans = qpow(26, n + k);
for (int i = 0; i < n; i++) {
ans = (ans - qpow(25, n + k - i) * C(n + k, i) % mod + mod) % mod;
}
printf("%lld\n", ans);
return 0;
}
ABC 171 F - Strivore 【容斥】的更多相关文章
- 2015 asia xian regional F Color (容斥 + 组合数学)
2015 asia xian regional F Color (容斥 + 组合数学) 题目链接http://codeforces.com/gym/100548/attachments Descrip ...
- “浪潮杯”第九届山东省ACM大学生程序设计竞赛 F: Four-tuples容斥定理
题目 F : Four-tuples 输入 1 1 1 2 2 3 3 4 4 输出 1 题意 给l1, r1, l2, r2, l3, r3, l4, r4 , 八个数据, 要求输出在区间[l ...
- 【BZOJ3930】[CQOI2015] 选数(容斥)
点此看题面 大致题意: 让你求出在区间\([L,H]\)间选择\(n\)个数时,有多少种方案使其\(gcd\)为\(K\). 容斥 原以为是一道可怕的莫比乌斯反演题. 但是,数据范围中有这样一句话:\ ...
- bzoj 3930: [CQOI2015]选数【快速幂+容斥】
参考:https://www.cnblogs.com/iwtwiioi/p/4986316.html 注意区间长度为1e5级别. 则假设n个数不全相同,那么他们的gcd小于最大数-最小数,证明:则gc ...
- 4.19 ABC F path pass i 容斥 树形dp
LINK:path pass i 原本想了一个点分治 yy了半天 发现重复的部分还是很难减掉 况且统计答案的时候有点ex. (点了别人的提交记录 发现dfs就过了 于是yy了一个容斥 发现可以直接减掉 ...
- 广东工业大学2016校赛决赛-网络赛 1174 Problem F 我是好人4 容斥
Problem F: 我是好人4 Description 众所周知,我是好人!所以不会出太难的题,题意很简单 给你n个数,问你1000000000(含1e9)以内有多少个正整数不是这n个数任意一个的倍 ...
- codeforces 597div2 F. Daniel and Spring Cleaning(数位dp+二维容斥)
题目链接:https://codeforces.com/contest/1245/problem/F 题意:给定一个区间(L,R),a.b两个数都是属于区间内的数,求满足 a + b = a ^ b ...
- ARC 093 F Dark Horse 容斥 状压dp 组合计数
LINK:Dark Horse 首先考虑1所在位置. 假设1所在位置在1号点 对于此时剩下的其他点的方案来说. 把1移到另外一个点 对于刚才的所有方案来说 相对位置不变是另外的方案. 可以得到 1在任 ...
- ACM-ICPC 2015 沈阳赛区现场赛 F. Frogs && HDU 5514(容斥)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5514 题意:有m个石子围成一圈, 有n只青蛙从跳石子, 都从0号石子开始, 每只能越过xi个石子.问所 ...
- BZOJ2839:集合计数(容斥,组合数学)
Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007. ...
随机推荐
- grafana展示的CPU利用率与实际不符的问题探究
问题描述 最近看了一个虚机的CPU使用情况,使用mpstat -P ALL命令查看系统的CPU情况(该系统只有一个CPU core),发现该CPU的%usr长期维持在70%左右,且%sys也长期维持在 ...
- SpringMVC:RESTful案例
目录 相关准备 功能清单 具体功能:访问首页 ①配置view-controller ②创建页面 具体功能:查询所有员工数据 ①控制器方法 ②创建employee_list.html 具体功能:删除 ① ...
- 我做的FFmpeg开源C#封装库Sdcb.FFmpeg
我做的FFmpeg开源C#封装库Sdcb.FFmpeg 写在前面: 该主题为2022年12月份.NET Conf China 2022我的主题,项目地址:https://github.com/sdcb ...
- LeetCode-382 链表随机结点
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/linked-list-random-node 题目描述 给你一个单链表,随机选择链表的一个节点, ...
- 实验一C语言开发环境使用和数据类型·运算符·表达式
#include<stdio.h> int main(){ printf(" o \n"); printf("<H>\n"); prin ...
- netstate查找端口占用
netstat -nao 列出本机端口占用信息加上|findstr 筛选 各个字段的意思: 协议 本地地址:端口 外部地址:端口 状态 PID 这 ...
- IO 多路复用 select/poll/epoll ---> Reactor ---> Netty
什么是内核态和用户态 https://blog.csdn.net/qq_41709234/article/details/124320482 参考:https://www.cnblogs.com/lo ...
- 面向对象基础之基础—控制台C#模拟银行ATM存取操作实例
c#控制台应用程序ATM银行操作实例.主要介绍了设计的方法:使用的类介绍:具体的运行界面:程序代码.代码直接写在一起放在Programm.cs中,拷贝可直接运行. 一.设计 1.原则上采用三层:(1) ...
- vue实现随机生成图形验证码
效果展示 安装插件 npm i identify 定义组件 verificationCode.vue <template> <!-- 图形验证码 --> <div cla ...
- Java——IO框架
IO框架 流:内存与存储设备之间传输数据的通道 分类 流向 输入流:从硬盘等外设到内存的流 输出流:从内存到硬盘等外设的流 传输单位 字节流(抽象类InputStream,OutputStream): ...