题目链接:点击查看

题目大意:给出一个 01 字符串,规定求值的过程如下:

  1. 每次选择末尾的两个数字:

    1. 如果为 0 0 ,那么替换成一个 1
    2. 否则替换成一个 0
  2. 循环往复,直至只剩一个数字位置,剩下的数字即为所求

现在问,对于所有长度为 n + m 的 01 字符串中,同时满足下列条件的字符串有多少个

  1. 恰好有 n 个 0 和 m 个 1
  2. 求值之后得到的答案等于 g(题目给出)

题目分析:网上一堆纯组合数学的题解,但是边界需要判断的很麻烦,不太喜欢那种解法(也可能是我太菜了,看不明白大佬们的思路),然后发现用 dp 写会格外简单

因为涉及到的状态只有 n 和 m,也就是分别为 0 的剩余个数以及 1 的剩余个数,所以我们设:f[ n ][ m ] 和 g[ n ][ m ] 分别为,剩余 n 个 0 以及 m 个 1 时,最后求值为 1 、0 的方案数

因为满足第一个条件的字符串就只有 C( n + m , m ) 个,所以不难看出,f[ n ][ m ] + g[ n ][ m ] = C( n + m , m )

然后进行递推,因为如果想要最后求值为 1,那么前一步一定要是两个 0 才行,所以不难看出 f[ n ][ m ] = g[ n - 1 ][ m ] = C( n - 1 + m , m ) - f[ n - 1 ][ m ],进一步观察出 m 在此递推式中充当常数的角色,所以进一步涉及 dp[ i ] = f[ i ][ m ],这样转移方程就推出来了:dp[ i ] = C( m + i - 1 , m ) - dp[ i - 1 ],然后对于 g = 1 和 g = 0 的答案就分别是 dp[ n ] 和 C( n + m , m ) - dp[ n ] 了

剩下一个初始化的问题,dp[ 0 ] 的含义实际上是,剩余 m 个 1 时,最后求值为 1 的方案数,这个需要分类讨论一下:

  1. 当 m == 1 时,显然 dp[ 0 ] = 1
  2. 当 m > 1 时,因为两个 1 会替换成一个 0,进而循环形成 1 0 的匹配,最后的求值是 0 ,所以 dp[ 0 ] = 0

所以此时只需要特判一下 m == 0 的情况了,根据 n 的奇偶输出答案即可

代码:

//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e6+100;const int mod=1e9+7;LL fac[N],inv[N],dp[N];LL q_pow(LL a,LL b)
{LL ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;
}void init()
{fac[0]=1;for(int i=1;i<N;i++)fac[i]=fac[i-1]*i%mod;inv[N-1]=q_pow(fac[N-1],mod-2);for(int i=N-2;i>=0;i--)inv[i]=inv[i+1]*(i+1)%mod;
}LL C(int n,int m)
{return fac[n]*inv[m]%mod*inv[n-m]%mod;
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.ans.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);init();int n,m,g;scanf("%d%d%d",&n,&m,&g);if(m==0){if(n%2==0&&g==1||n%2==1&&g==0)puts("1");elseputs("0");return 0;}dp[0]=(m==1?1:0);for(int i=1;i<=n;i++)dp[i]=(C(m+i-1,m)-dp[i-1]+mod)%mod;if(g==1)printf("%lld\n",dp[n]);elseprintf("%lld\n",(C(n+m,m)-dp[n]+mod)%mod);return 0;
}

CodeForces - 336D Vasily the Bear and Beautiful Strings(dp+组合数学)相关推荐

  1. CodeForces - 336A Vasily the Bear and Triangle

    CodeForces - 336A Vasily the Bear and Triangle 题意: 给你一个点x,现在这个点和原点组成了矩形,让你在x和y轴分别求一个点,与原点构成的三角形,要求矩形 ...

  2. 2021牛客多校5 - Double Strings(dp+组合数学)

    题目链接:点击查看 题目大意:给出两个字符串 sss 和 ttt,要求 "一段相同的前缀" + "一个不同的字符(满足s[i]<t[j])"+ " ...

  3. [Codeforces Round #195 (Div. 2)] A. Vasily the Bear and Triangle

    A. Vasily the Bear and Triangle time limit per test 1 second memory limit per test 256 megabytes inp ...

  4. [Codeforces Round #195 DIV2E (CF336E)] Vasily the Bear and Painting Square

    题意 当n=0n=0时有如下图像 当n=1n=1时有如下图像 当n=2n=2时有如下图像 题目要求对定的nn的图像,染k个三角形(并不要求染最小的三角形),求染色方案数. 需要注意的是:即使染色完毕后 ...

  5. Codeforces Round #181 (Div. 2) C. Beautiful Numbers 排列组合 暴力

    C. Beautiful Numbers 题目连接: http://www.codeforces.com/contest/300/problem/C Description Vitaly is a v ...

  6. Codeforces Round #313 (Div. 1) B. Equivalent Strings

    Equivalent Strings Problem's Link:   http://codeforces.com/contest/559/problem/B  Mean: 给定两个等长串s1,s2 ...

  7. C. Tyler and Strings(组合数学,树状数组维护前缀和)(Codeforces Round #775 (Div. 1, based on Moscow Open Olympiad i)

    对我来说比较困难的一题了,尝试着自己写了一下,调不出来遂放弃. Codeforces Round #775 (Div. 1, based on Moscow Open Olympiad in Info ...

  8. 【CodeForces - 289C】Polo the Penguin and Strings (水题,字符串,思维构造,有坑)

    题干: Little penguin Polo adores strings. But most of all he adores strings of length n. One day he wa ...

  9. 【CodeForces - 574D】Bear and Blocks (dp,思维)

    题干: Limak is a little bear who loves to play. Today he is playing by destroying block towers. He bui ...

最新文章

  1. Java案例——统计字符串中每个字符串出现的次数
  2. “adb不是内部或外部命令,也不是可执行的应用程序”错误原因及解决方法
  3. CentOS系列启动流程详解
  4. [笔记] FireDAC DataSet 导入及导出 JSON
  5. python访问数据库统一方法_Python 3.x 连接数据库(pymysql 方式)
  6. 嵌入式如何移植php,关于嵌入式web服务器的移植
  7. Spring Boot:在Spring Boot中使用定时任务
  8. HTML5新增元素之Canvas-实现太极八卦图和扇子
  9. 动态合并Repeater控件数据列
  10. ADO.NET(二)
  11. 【收藏】基于Dockerfile搭建JAVA Tomcat运行环境
  12. simulink和psim仿真结果不同_Abaqus软件掌握大部件焊接仿真的解决思路
  13. Linux RTC驱动模型分析之rtc-proc.c
  14. VRay渲染器之家装户型渲染实战记录
  15. 一个很酷的快速开发代码生成器系统
  16. 系统设计的原则、特点与任务
  17. word文档中如何将软回车替换为硬回车
  18. 新型远程下载功能路由器NW762简介
  19. OEM和ODM的区别
  20. win7 linux三系统,苹果电脑装windows7,Linux,mac os三系统,不需要BootBoot | MOS86

热门文章

  1. 利用sshpass实现ansible功能
  2. 以下可以作为c语言合法变量名的是,2016年河南科技学院信息工程学院C语言上机编程复试笔试最后押题五套卷...
  3. MySQL高级 - 锁 - InnoDB行锁 - 基本演示
  4. 使用Docker-容器命令介绍
  5. 分布式ID-数据库自增ID
  6. C 基本语法 | 菜鸟教程
  7. 用注解还是用xml 配置?
  8. RedisPlus图形化客户端-支持集群的访问
  9. 代码演示:获取锁时被中断
  10. Hive的基本操作-自定义函数