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 5350. 【NOIP2017提高A组模拟9.7】陶陶摘苹果

    题目 分析 很神奇的事情又发生了!! 很容易想到设 \(f_{i,j}\) 表示考虑前 \(i\) 个区间,已选 \(j\) 个区间且必选第 \(i\) 时能覆盖到的最多苹果数 转移 \(O(n)\) ...

  2. 分享手机上一款超多功能的APP(含428个功能):宇宙工具箱

    无意中在网上发现一款功能超多的安卓APP,作者宣称是三百多个功能,但是目前统计已经有四百多个,而且不包含网友分享的上千功能. 这款工具的名称叫:宇宙工具箱. 它的功能主要包含10个类别: 图片工具 日 ...

  3. 题解 P1627 [CQOI2009] 中位数

    傻逼题但是被自己的傻逼操作爆了好几次零(悲愤 .... 没什么好讲的,一眼题... //SIXIANG #include <iostream> #define int long long ...

  4. 轻量级CI/CD发布部署环境搭建及使用_03_docker安装harbor

    轻量级CI/CD发布部署环境搭建及使用_03_docker安装harbor 授人以鱼不如授人以渔,如果说的别人都没明白,说明自己实际也不是太明白   1,下载docker-compose sudo c ...

  5. npm+react linux 开荒

    安装npm 从 https://nodejs.org/dist/ 找到下载包,并不是版本越高越好,得看项目的需要. 解压之后,将解压路径bin添加到PATH里. 完成后可配置npm源 npm inst ...

  6. wwise 音频引擎介绍

    https://blog.csdn.net/GJQI12/article/details/108007696

  7. Java实现台球游戏的动画实现相关代码

    package com.bjsxt;//scr中新建的包packageimport java.awt.*;import javax.swing.*;public class BallGame exte ...

  8. 这个仅2M的宝藏小工具,竟无需群发就能揪出微信所有单向好友!

    背景:很多人平时微信跟人发消息的时候,发现自己已经被对方清理掉了,因此可能想把自己的微信单向好友都清理出去."转账验证好友"是大部分人已经都知道的方法,但是好友太多,我们实在是无法 ...

  9. .NetCore2.0引用DLL报System.InvalidOperationException: Can not find compilation library location for package 'XXX'

    .NET CORE 2.0 MVC项目引用类库出现:System.InvalidOperationException: Can not find compilation library locatio ...

  10. sql两种表联查更新的方法

    1.update ceshi c1,ceshi2 c2 set c1.num=c2.aa where c1.id=c2.cid; 2.update ceshi c1 INNER JOIN ceshi2 ...