AtCoder Grand Contest 040 C - Neither AB nor BA
好妙的题啊
首先容易想到简单容斥,统计合法方案数可以考虑总方案数减去不合法方案数
那么先考虑如何判断一个串是否合法,但是直接判断好像很不好搞
这时候就需要一些 $magic$ 了,把所有位置下标为奇数的字符 $\text{A}$ 换成 $\text{B}$ ,$\text{B}$ 换成 $\text{A}$
然后发现对于转化后的串,原本的限制变成了不能删除 $AA$ 和 $BB$ ,考虑到原串和新串是一一对应的
所以如果能算出合法新串的数量那么即为答案
然后容易发现,新串合法的充分必要条件为:字符 $A$ 和字符 $B$ 数量的最大值不超过 $n/2$
首先显然是必要的,因为如果某一个字符 $c$ 数量超过一半其他的字符不管怎么和 $c$ 抵消最后都会剩下一些 $c$ 没法消除
然后也容易证明是充分的,对于任意时刻,假设此时 $A$ 的数量大于等于 $B$ 的数量,那么我们只要优先让 $A$ 和其他字符抵消
显然一定存在某个 $A$ 它的旁边有其他字符
如果 $B$ 的数量比 $A$ 多,我们也只要优先消 $B$ 即可
那么证明完成了,统计不合法方案十分简单,枚举 $k>n/2$ ,然后算一下 $n$ 个位置任意选 $k$ 个填 $A$ ,剩下其他位置填不为 $A$ 的字符的方案数
$B$ 也同理,然后就做完了
这里简单容斥的时候显然不用再加上 $A,B$ 数量同时大于 $n/2$ 的情况(因为不存在)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=1e7+,mo=;
inline int fk(int x) { return x>=mo ? x-mo : x; }
int n,fac[N],facinv[N];
int ksm(int x,int y)
{
int res=;
while(y) { if(y&) res=1ll*res*x%mo; x=1ll*x*x%mo; y>>=; }
return res;
}
inline int C(int x,int y) { return 1ll*fac[x]*facinv[y]%mo*facinv[x-y]%mo; }
int main()
{
n=read();
fac[]=;
for(int i=;i<=n;i++) fac[i]=1ll*fac[i-]*i%mo;
facinv[n]=ksm(fac[n],mo-);
for(int i=n-;i>=;i--) facinv[i]=1ll*facinv[i+]*(i+)%mo;
int ans=ksm(,n);
for(int k=n/+;k<=n;k++)
ans=fk(ans-2ll*C(n,k)*ksm(,n-k)%mo+mo);
printf("%d\n",ans);
return ;
}
AtCoder Grand Contest 040 C - Neither AB nor BA的更多相关文章
- 【AtCoder】AtCoder Grand Contest 040 解题报告
点此进入比赛 \(A\):><(点此看题面) 大致题意: 给你一个长度为\(n-1\).由\(<\)和\(>\)组成的的字符串,第\(i\)位的字符表示第\(i\)个数和第\( ...
- AtCoder Grand Contest 040
Preface 今年准备省选啥都不说了,省选题基本上都做过一遍了,开始尝试板刷AGC 这场做完就从AGC001开始吧,感觉以我的速度和来机房的频率一个礼拜做一场都谢天谢地了 A - >< ...
- AtCoder Grand Contest 040 简要题解
从这里开始 比赛目录 A < B < E < D < C = F,心情简单.jpg. Problem A >< 把峰谷都设成 0. Code #include &l ...
- AtCoder Grand Contest 040 B - Two Contests
传送门 一看就感觉很贪心 考虑左端点最右的区间 $p$ 和右端点最左的区间 $q$ 如果 $p,q$ 属于同一个集合(设为 $S$,另一个集合设为 $T$),那么其他的区间不管是不是在 $S$ 都不会 ...
- AtCoder Grand Contest 040 A - ><
传送门 对于某个位置,只要知道这个位置往左最多的连续 $\text{<}$ 的数量 $x$ 和往右最多的连续 $\text{>}$ 的数量 $y$ 那么这个位置最小可能的数即为 $max( ...
- AtCoder Grand Contest 031 简要题解
AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...
- AtCoder Grand Contest 006
AtCoder Grand Contest 006 吐槽 这套题要改个名字,叫神仙结论题大赛 A - Prefix and Suffix 翻译 给定两个串,求满足前缀是\(S\),后缀是\(T\),并 ...
- AtCoder Grand Contest 012
AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...
- AtCoder Grand Contest 011
AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...
随机推荐
- idea 2019激活码
9MWZD5CC4E-eyJsaWNlbnNlSWQiOiI5TVdaRDVDQzRFIiwibGljZW5zZWVOYW1lIjoiMjAxNzY1MDYxQGNxdS5lZHUuY24gLiIsI ...
- Android数据绑定DataBinding(一)入门篇
早上看到了一篇推文"还在使用繁琐的findViewById,跟着尝试了一下DataBinding,之前使用ButteKnife就已经干掉了findViewById.因为写过微信小程序,那种在 ...
- Matlab注释的几个方法
Matlab最简单的注释当然是 %x= %这是注释,无法运行 x= %结果为2 然而%只能注释一行,如何注释更加快捷简便地注释多行呢? %{ .这就是传说中的多行注释 .成功! %} 经常需要调试程序 ...
- ijkplayer相关
直播技术总结(二)ijkplayer的编译到Android平台并测试解码库 https://blog.csdn.net/hejjunlin/article/details/55670380
- SpringMVC拦截器工作流程图
- Python SciPy库——插值与拟合
插值与拟合 原文链接:https://zhuanlan.zhihu.com/p/28149195 1.最小二乘拟合 实例1 # -*- coding: utf-8 -*- import numpy a ...
- Java环境中,word文档转PDF直接打开浏览而非下载
在平台上,需要把文档直接浏览而非下载,实现方法是先把文档转为PDF文件, 但在linux系统中确实汉字字库,所以转换失败,以下是解决方法 后面正式服务器也要添加字库,不然会转换出乱码文件,处理步骤如下 ...
- JavaScript this指向问题
this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定,this最终指向调用它的对象. 1.函数调用模式: 当一个函数并非一个对象的属性时,那么它就是被当做函数来调用的.在此种模式下, ...
- iOS的多线程技术
iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ØN ...
- jQuery动态创建html元素的常用方法汇总
在使用jQuery进行WEB程序设计的时候非常有用.分享给大家供大家参考.具体方法如下: 一般来说,可以通过以下几种方式动态创建html元素: 1.使用jQuery创建元素的语法 2.把动态内容存放到 ...