CF 1045 H. Self-exploration 解题报告
CF 1045 H. Self-exploration
考虑到串的结构一定是
1...0....1....0.....1...
这样的,而\(01\)与\(10\)在转折点交替出现
首先串长一定是\(a+b+c+d+1\)(分别代表\(00,01,10,11\)的数量),且首位一定是\(1\),还需要满足\(b=c\lor b=c-1\),先不考虑限制计数一波
我们发现,实际上我们需要把所有\(0\)中选择若干个作为转折点,然后\(1\)也这样,剩下的直接按照转折填进去就可以了
注意到\(0\)和\(1\)的个数分别是\(a+c\)和\(b+d+1\)
然后转折点已经必须在第一位出现一次了,所以方案数是\(\binom{a+c-1}{c}\)与\(\binom{b+d}{b}\),乘法原理就可以了
然后考虑限制,我们从最高位开始填充
如果当前位是\(0\),就只能填\(0\),继续向后填
如果当前为是\(1\),填\(0\)以后后面可以随便填了,可以按没有限制的差不多的算,只是最高位钦定是\(0\);填\(1\)就也是继续往后填
注意填的过程稍微注意一下边界判断,否则可能数组越界什么的
Code:
#include <cstdio>
#include <cctype>
#include <cstring>
#include <vector>
#include <algorithm>
const int SIZE=1<<21;
char ibuf[SIZE],*iS,*iT;
//#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),iS==iT?EOF:*iS++):*iS++)
#define gc() getchar()
template <class T>
void read(T &x)
{
int f=0;x=0;char c=gc();
while(!isdigit(c)) f|=c=='-',c=gc();
while(isdigit(c)) x=x*10+c-'0',c=gc();
if(f) x=-x;
}
const int N=2e5+1;
const int mod=1e9+7;
char s[N],t[N];
int fac[N],inv[N];
inline void add(int &x,int y){x+=y;if(x>=mod) x-=mod;}
#define mul(a,b) (1ll*(a)*(b)%mod)
inline int qp(int d,int k)
{
int f=1;
while(k)
{
if(k&1) f=mul(f,d);
d=mul(d,d);
k>>=1;
}
return f;
}
int C(int m,int n)
{
if(m==n) return 1;
return mul(fac[m],mul(inv[m-n],inv[n]));
}
int cal(int c00,int c01,int c10,int c11,char *s)
{
int n=strlen(s+1),l=c00+c01+c10+c11;
if(c10!=c01&&c10!=c01+1) return 0;
if(n>l+1) return mul(C(c00+c10-1,c10-1),C(c11+c01,c01));
if(n<l+1) return 0;
int pre=1,ret=0;
for(int i=2;i<=n;i++)
{
if(s[i]=='0')
{
if(pre) --c10;
else --c00;
pre=0;
}
else
{
if(pre) --c10;
else --c00;
if(c01!=c10||c01!=c10+1) add(ret,mul(C(c00+c10,c10),C(c11+c01-1,c01-1)));
if(pre) ++c10;
else ++c00;
if(pre) --c11;
else --c01;
pre=1;
}
if(c00<0||c01<0||c10<0||c11<0) break;
}
return ret;
}
int ck(int c00,int c01,int c10,int c11,char *s)
{
int n=strlen(s+1),l=c00+c01+c10+c11;
if(n!=l+1) return 0;
int pre=s[1]-'0';
for(int i=2;i<=n;i++)
{
if(pre)
{
if(s[i]=='1') --c11;
else --c10;
}
else
{
if(s[i]=='1') --c01;
else --c00;
}
pre=s[i]-'0';
}
return !c00&&!c01&&!c10&&!c11;
}
int main()
{
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
scanf("%s%s",s+1,t+1);
fac[0]=1;
for(int i=1;i<N;i++) fac[i]=mul(fac[i-1],i);
inv[N-1]=qp(fac[N-1],mod-2);
for(int i=N-2;~i;i--) inv[i]=mul(inv[i+1],i+1);
int c00,c01,c10,c11;
read(c00),read(c01),read(c10),read(c11);
int ans=((cal(c00,c01,c10,c11,t)-cal(c00,c01,c10,c11,s)+ck(c00,c01,c10,c11,t))%mod+mod)%mod;
printf("%d\n",ans);
return 0;
}
2019.6.2
CF 1045 H. Self-exploration 解题报告的更多相关文章
- CF Round #600 (Div 2) 解题报告(A~E)
CF Round #600 (Div 2) 解题报告(A~E) A:Single Push 采用差分的思想,让\(b-a=c\),然后观察\(c\)序列是不是一个满足要求的序列 #include< ...
- CF Gym100548 K Last Defence 解题报告
先特判掉特殊情况: $a=b,Ans=2$ $ab=0,a+b>0,Ans=2$ $a=b=0,Ans=1$ 考虑剩下的非特殊情况.记$Solve(a,b)$为数列中除了$a,b$外的不同的数的 ...
- 2018 ACM南京网络赛H题Set解题报告
题目描述 给定\(n\)个数$a_i$,起初第\(i\)个数在第\(i\)个集合.有三种操作(共\(m\)次): 1 $u$ $v$ 将第$u$个数和第$v$个数所在集合合并 2 $u$ 将第$u$个 ...
- 12.27 cf div3 解题报告
12.27 cf div3 解题报告 wxy.wxy,带上分拉,全场做了个无脑小白 比赛场地 A: T1,跟着模拟就好了 B: sort一遍之后 去除的数一定是a[1]或者a[n] 比较去除谁小就输出 ...
- CF 1087解题报告
cf解题报告 记录一下吧 做出:T1 rating :-97 想起几个月前做不出T1还是有点小搞笑呀2333 T1 双指针+特判 T2 发现k特别小,枚举剩余系 还要判断是否是能被n整除 移项发现可以 ...
- Codeforces Round #382 (Div. 2) 解题报告
CF一如既往在深夜举行,我也一如既往在周三上午的C++课上进行了virtual participation.这次div2的题目除了E题都水的一塌糊涂,参赛时的E题最后也没有几个参赛者AC,排名又成为了 ...
- Codeforces Round #378 (Div. 2) D题(data structure)解题报告
题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...
- Codeforces Round #277.5 解题报告
又熬夜刷了cf,今天比正常多一题.比赛还没完但我知道F过不了了,一个半小时贡献给F还是没过--应该也没人Hack.写写解题报告吧= =. 解题报告例如以下: A题:选择排序直接搞,由于不要求最优交换次 ...
- cf1187解题报告
cf1187解题报告 cf A 去掉都有的,剩下的取最大值+1 #include <bits/stdc++.h> #define int long long using namespace ...
随机推荐
- 存储系统设计——NVMe SSD性能影响因素一探究竟
目录1 存储介质的变革 2 NVME SSD成为主流 2.1 NAND FLASH介质发展 2.2 软件层面看SSD——多队列技术 2.3 深入理解SSD硬件 3 影响NVME SSD的性能因素 3. ...
- AT2000 Leftmost Ball(计数dp+组合数学)
传送门 解题思路 设\(f[i][j]\)表示填了\(i\)个白色,\(j\)种彩色的方案数,那么显然\(j<=i\).考虑这个的转移,首先可以填一个白色,就是\(f[i][j]=f[i-1][ ...
- LOJ 3058 「HNOI2019」白兔之舞——单位根反演+MTT
题目:https://loj.ac/problem/3058 先考虑 n=1 怎么做.令 a 表示输入的 w[1][1] . \( ans_t = \sum\limits_{i=0}^{L}C_{L} ...
- window 任务管理器
用的是win10 系统,一般window都差不多. 1.查看进程: 2.查看端口:性能 --> 打开资源资源监视器 --> 网络 --> 侦听端口 3.查看磁盘活动(查看文件被哪个进 ...
- [CSP-S模拟测试]:english(可持久化Trie+启发式合并)
题目传送门(内部题24) 输入格式 第一行有$3$个整数$n,opt$,$opt$的意义将在输出格式中提到.第二行有$n$个整数,第$i$个整数表示$a_i$. 输出格式 若$opt=1$,输出一行一 ...
- 测开之路四十九:用Django实现扑克牌游戏
用Django实现和之前flask一样的扑克牌游戏 项目结构 html <!DOCTYPE html><html lang="en"><head> ...
- iview+vue 使用中遇到的问题(表格、select、radio)
1.iview+vue中,对表头的动态设置: iview表头若是需要动态设置,可以有两个方法,第一种: children: [ { title: '2017年', align: 'center', k ...
- Maven初了解
这周开始,我正式上手了接口测试.我们接口测试使用的是Maven做项目管理,用Junit做测试框架.所以我稍微了解了一下Maven. 那么什么是Maven呢? Maven是基于项目对象模型(POM pr ...
- Java 课程总结
学到了什么 本学期通过老师的教导与自学,在Java课程具体学到了以下知识: 1.面向对象编程 1.1 类与对象(匿名对象) 类是由方法与属性组成,其定义了一个基本的模板,代表一个共性.其中属性也可以是 ...
- Python 学习笔记12 函数模块
函数的优点之一,使用它们可将代码块与主程序分离.通过给函数指定描述性的名称.可以让主程序非常好理解.但是如果将过多的函数和主程序放置在一起,会让文件显得非常凌乱.太多的代码混杂在一起,不方便管理.我们 ...