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 【容斥】的更多相关文章

  1. 2015 asia xian regional F Color (容斥 + 组合数学)

    2015 asia xian regional F Color (容斥 + 组合数学) 题目链接http://codeforces.com/gym/100548/attachments Descrip ...

  2. “浪潮杯”第九届山东省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 ...

  3. 【BZOJ3930】[CQOI2015] 选数(容斥)

    点此看题面 大致题意: 让你求出在区间\([L,H]\)间选择\(n\)个数时,有多少种方案使其\(gcd\)为\(K\). 容斥 原以为是一道可怕的莫比乌斯反演题. 但是,数据范围中有这样一句话:\ ...

  4. bzoj 3930: [CQOI2015]选数【快速幂+容斥】

    参考:https://www.cnblogs.com/iwtwiioi/p/4986316.html 注意区间长度为1e5级别. 则假设n个数不全相同,那么他们的gcd小于最大数-最小数,证明:则gc ...

  5. 4.19 ABC F path pass i 容斥 树形dp

    LINK:path pass i 原本想了一个点分治 yy了半天 发现重复的部分还是很难减掉 况且统计答案的时候有点ex. (点了别人的提交记录 发现dfs就过了 于是yy了一个容斥 发现可以直接减掉 ...

  6. 广东工业大学2016校赛决赛-网络赛 1174 Problem F 我是好人4 容斥

    Problem F: 我是好人4 Description 众所周知,我是好人!所以不会出太难的题,题意很简单 给你n个数,问你1000000000(含1e9)以内有多少个正整数不是这n个数任意一个的倍 ...

  7. codeforces 597div2 F. Daniel and Spring Cleaning(数位dp+二维容斥)

    题目链接:https://codeforces.com/contest/1245/problem/F 题意:给定一个区间(L,R),a.b两个数都是属于区间内的数,求满足 a + b = a ^ b ...

  8. ARC 093 F Dark Horse 容斥 状压dp 组合计数

    LINK:Dark Horse 首先考虑1所在位置. 假设1所在位置在1号点 对于此时剩下的其他点的方案来说. 把1移到另外一个点 对于刚才的所有方案来说 相对位置不变是另外的方案. 可以得到 1在任 ...

  9. ACM-ICPC 2015 沈阳赛区现场赛 F. Frogs && HDU 5514(容斥)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5514 题意:有m个石子围成一圈, 有n只青蛙从跳石子, 都从0号石子开始, 每只能越过xi个石子.问所 ...

  10. BZOJ2839:集合计数(容斥,组合数学)

    Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007. ...

随机推荐

  1. JZOJ 5062. 【GDOI2017第二轮模拟day1】航海舰队

    \(\text{Solution}\) 这还是 [Lydsy2017省队十连测] 的题 不得不说 \(FFT\) 在字符串匹配中的妙啊! 前面做了道一维的题,现在这是二维的 从题目入手,不考虑可不可达 ...

  2. JZOJ 3447.摘取作物

    \(\text{Problem}\) 在一个矩阵里选数,每行最多选两个,每列最多选两个,最大会价值 \(n,m \le 30\) \(\text{Analysis}\) 对个这个限制如何实现? 跑费用 ...

  3. 线段树优化DP学习笔记 & JZOJ 孤独一生题解

    在 \(DP\) 的世界里 有一种题需要单调队列优化 \(DP\) 一般在此时,\(f_i\) 和它的决策集合 \(f_j\) 在转移时 \(i\) 不和 \(j\) 粘在一起(即所有的 \(j\) ...

  4. mybatis中的土鸡杂鱼

    mybatis中的土鸡杂鱼 目录 mybatis中的土鸡杂鱼 1.mapper接口为什么要和mapper.xml在同一个路径下? 2.主键生成为什么配置一个字段就可以? 原理 3.为什么默认使用的是预 ...

  5. 简单使用wireshark

    wireshark抓包工具 拓扑图: 拓扑图解释:终端用户使用wireshark抓包工具监听无线网卡,监听时,终端访问互联网,可实时监听网络抓包 操作步骤: 一,打开wireshark抓包工具,监听网 ...

  6. 云服务器 CentOS 的使用历程

    ------------恢复内容开始------------ CentOS图形页面的下载 安装X(X Window System),命令如下: yum groupinstall "X Win ...

  7. windows10 远程桌面黑屏

    [计算机配置]-[管理模板]-[Windows组件]-[远程桌面服务]-[远程桌面会话主机]-[远程会话环境]-{为远程桌面连接使用WDDM图形显示驱动程序-设置禁用}

  8. 1137. 第 N 个泰波那契数 (Easy)

    问题描述 1137. 第 N 个泰波那契数 (Easy) 泰波那契序列 T 定义如下: T = 0, T = 1, T = 1, 且在 n >= 0 的条件下 T = T + T + T 给你整 ...

  9. C++ MFC学习 (一)

    MFC:微软基础类库,以C++形式封装了WindowsAPI,并且包含一个应用程序框架,以减少应用程序开发人员的工作量.    其中包含的类包含大量Windows句柄封装类和很多Windows的内建控 ...

  10. java double/float转BigDecimal,精度问题

    double/float 转BigDecimal,会有精度问题.所以需要转String类型,然后再转BigDecimal