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 解题报告的更多相关文章

  1. CF Round #600 (Div 2) 解题报告(A~E)

    CF Round #600 (Div 2) 解题报告(A~E) A:Single Push 采用差分的思想,让\(b-a=c\),然后观察\(c\)序列是不是一个满足要求的序列 #include< ...

  2. 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$外的不同的数的 ...

  3. 2018 ACM南京网络赛H题Set解题报告

    题目描述 给定\(n\)个数$a_i$,起初第\(i\)个数在第\(i\)个集合.有三种操作(共\(m\)次): 1 $u$ $v$ 将第$u$个数和第$v$个数所在集合合并 2 $u$ 将第$u$个 ...

  4. 12.27 cf div3 解题报告

    12.27 cf div3 解题报告 wxy.wxy,带上分拉,全场做了个无脑小白 比赛场地 A: T1,跟着模拟就好了 B: sort一遍之后 去除的数一定是a[1]或者a[n] 比较去除谁小就输出 ...

  5. CF 1087解题报告

    cf解题报告 记录一下吧 做出:T1 rating :-97 想起几个月前做不出T1还是有点小搞笑呀2333 T1 双指针+特判 T2 发现k特别小,枚举剩余系 还要判断是否是能被n整除 移项发现可以 ...

  6. Codeforces Round #382 (Div. 2) 解题报告

    CF一如既往在深夜举行,我也一如既往在周三上午的C++课上进行了virtual participation.这次div2的题目除了E题都水的一塌糊涂,参赛时的E题最后也没有几个参赛者AC,排名又成为了 ...

  7. Codeforces Round #378 (Div. 2) D题(data structure)解题报告

    题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...

  8. Codeforces Round #277.5 解题报告

    又熬夜刷了cf,今天比正常多一题.比赛还没完但我知道F过不了了,一个半小时贡献给F还是没过--应该也没人Hack.写写解题报告吧= =. 解题报告例如以下: A题:选择排序直接搞,由于不要求最优交换次 ...

  9. cf1187解题报告

    cf1187解题报告 cf A 去掉都有的,剩下的取最大值+1 #include <bits/stdc++.h> #define int long long using namespace ...

随机推荐

  1. 天池平台再升级,打造产业AI知识共享、技术共享平台

    在5月23日的云栖大会·武汉峰会上,天池发布“全球AI开发者计划”,打造一站式人工智能知识共享平台,计划2年内在平台上集聚30万AI工程师.同时,阿里云天池正式升级,成为从产业机会到实施交付一站式解决 ...

  2. oracle11g笔记

    安装 #!/bin/bash #安装oracle110203 pageDir="/opt/tools/oracle" bdFile="/tmp/bdFile.txt&qu ...

  3. [CSP-S模拟测试]:密州盛宴(贪心)

    江城子·密州出猎老夫聊发少年狂,左牵黄,右擎苍,锦帽貂裘,千骑卷平冈.为报倾城随太守,亲射虎,看孙郎.酒酣胸胆尚开张,鬓微霜,又何妨!持节云中,何日遣冯唐?会挽雕弓如满月,西北望,射天狼.(这首词通过 ...

  4. STM32 入门之 GPIO

    入手STM32有一段时间了,感觉刚入门时很难,无处下手,现在学到了点皮毛,写出来和大家分享一下. 首先,什么叫GPIO?这个问题,答案是我也不知道!至少目前我没有必要知道,我只要知道他其实就是51单片 ...

  5. Majordomo Info VGER.KERNEL.ORG

    This is VGER.KERNEL.ORG Majordomo Info The mission of vger.kernel.org is to provide email list servi ...

  6. 项目搭建(一):windows UIAutomation API 框架

    [环境] 操作系统:Windows7 集成环境:Visual Studio2015 编程语言:C# 目标框架:.net framework4.6 1.新建项目 Visual Studio 2015 [ ...

  7. python中列表元素连接方法join用法实例

    python中列表元素连接方法join用法实例 这篇文章主要介绍了python中列表元素连接方法join用法,实例分析了Python中join方法的使用技巧,非常具有实用价值,分享给大家供大家参考. ...

  8. 聚合函数:sum,count,max,avg

    聚合函数:sum,count,max,avg等,一般作用于多条记录上.通过group by可以将数据对属于一组的数据起作用. SELECT region, SUM(population), SUM(a ...

  9. webapi返回json格式优化 转载https://www.cnblogs.com/GarsonZhang/p/5322747.html

    一.设置webapi返回json格式 在App_Start下的WebApiConfig的注册函数Register中添加下面这代码 1 config.Formatters.Remove(config.F ...

  10. 在线清空nohup.out内容

    通过 cat /dev/null > filename 命令可以在线清空nohup.out里的内容