Codeforces 1045H Self-exploration 思维
时间:2019-10-23
本文章向大家介绍Codeforces 1045H Self-exploration 思维,主要包括Codeforces 1045H Self-exploration 思维使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
对于给定的c00, c01, c10, c11, 我们能得出0的段数, 1的段数, 0的个数, 1的个数。
然后就是用隔板法算方案数, 对于小于A这个操作, 我们枚举小于的位置用同样的方法算方案数就好啦。
#include<bits/stdc++.h> using namespace std; const int N = (int)1e5 + 7; const int mod = (int)1e9 + 7; int inv[N], F[N], Finv[N], c[2][2], cc[2][2]; int n, len; char s[N], t[N]; inline int C(int n, int m) { if(n == -1 && m == -1) return 1; if(n < 0 || n < m) return 0; return 1LL * F[n] * Finv[m] % mod * Finv[n - m] % mod; } inline int getAns0(int c[2][2], int n) { if(c[0][1] < c[1][0] || c[0][1] > c[1][0] + 1) return 0; for(int i = 0; i < 2; i++) { for(int j = 0; j < 2; j++) { if(c[i][j] < 0) return 0; } } int seg0, seg1; if(c[0][1] == c[1][0]) seg0 = c[0][1] + 1, seg1 = c[0][1]; else seg0 = c[0][1], seg1 = c[0][1]; int cnt0 = c[0][0] + seg0; int cnt1 = c[1][1] + seg1; if(cnt0 + cnt1 != n) return 0; return 1LL * C(cnt0 - 1, seg0 - 1) * C(cnt1 - 1, seg1 - 1) % mod; } inline int getAns1(int c[2][2], int n) { if(c[1][0] < c[0][1] || c[1][0] > c[0][1] + 1) return 0; for(int i = 0; i < 2; i++) { for(int j = 0; j < 2; j++) { if(c[i][j] < 0) return 0; } } int seg0, seg1; if(c[1][0] == c[0][1]) seg1 = c[1][0] + 1, seg0 = c[1][0]; else seg1 = c[1][0], seg0 = c[1][0]; int cnt0 = c[0][0] + seg0; int cnt1 = c[1][1] + seg1; if(cnt0 + cnt1 != n) return 0; return 1LL * C(cnt0 - 1, seg0 - 1) * C(cnt1 - 1, seg1 - 1) % mod; } int solve(char *s, int n) { int ans = 0; memcpy(cc, c, sizeof(cc)); for(int i = 2; i <= n; i++) { if(s[i] == '1') { cc[s[i - 1] - '0'][0]--; ans += getAns0(cc, n - i + 1); if(ans >= mod) ans -= mod; cc[s[i - 1] - '0'][0]++; } cc[s[i - 1] - '0'][s[i] - '0']--; if(cc[s[i - 1] - '0'][s[i] - '0'] < 0) return ans; } int ok = 1; for(int i = 0; i < 2; i++) { for(int j = 0; j < 2; j++) { if(cc[i][j]) ok = 0; } } ans = (ans + ok) % mod; return ans; } int check(char *s, int n) { memset(cc, 0, sizeof(cc)); for(int i = 1; i < n; i++) cc[s[i] - '0'][s[i + 1] - '0']++; for(int i = 0; i < 2; i++) { for(int j = 0; j < 2; j++) { if(cc[i][j] != c[i][j]) return 0; } } return 1; } int main() { inv[1] = F[0] = Finv[0] = 1; for(int i = 2; i < N; i++) inv[i] = 1LL * (mod - mod / i) * inv[mod % i] % mod; for(int i = 1; i < N; i++) F[i] = 1LL * F[i - 1] * i % mod; for(int i = 1; i < N; i++) Finv[i] = 1LL * Finv[i - 1] * inv[i] % mod; scanf("%s%s", s + 1, t + 1); int len_s = strlen(s + 1); int len_t = strlen(t + 1); scanf("%d%d%d%d", &c[0][0], &c[0][1], &c[1][0], &c[1][1]); len = 1; while(!getAns1(c, len) && len <= len_t) len++; if(len > len_t) return puts("0"), 0; int ans = 0; if(len_s < len && len < len_t) ans = getAns1(c, len); else if(len < len_s || len > len_t) ans = 0; else if(len == len_s && len == len_t) { ans = solve(t, len_t); ans -= solve(s, len_s) - check(s, len_s); if(ans < 0) ans += mod; if(ans >= mod) ans -= mod; } else if(len == len_s) { ans = getAns1(c, len); ans -= solve(s, len_s) - check(s, len_s); if(ans < 0) ans += mod; } else if(len == len_t) { ans = solve(t, len_t); } else assert(0); printf("%d\n", ans); return 0; } /** **/
原文地址:https://www.cnblogs.com/CJLHY/p/11725242.html
- jboss eap 6.2+ 版本中 加密datasource密码等敏感信息
- WordPress自定义栏目运用实例II:添加文章Meta标签(keywords /description)
- 《Deep Learning with Python》第一章 1.1 人工智能、机器学习和深度学习
- boost::function的用法
- rpc框架之 thrift 学习 1 - 安装 及 hello world
- WordPress自定义栏目运用实例Ⅰ:添加文章来源
- ZooKeeper 笔记(5) ACL(Access Control List)访问控制列表
- 算法:支持重复元素的二分查找
- .NET 异常处理的动作策略(Action Policy)
- 如何在mac本上安装android sdk
- Fityk-曲线拟合工具
- maven: 打包可运行的jar包(java application)及依赖项处理
- Effective java 第2版 - 笔记(01) 单例(Singleton)的枚举(enum)实现
- 恶心的0.5四舍五入问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法