CTU Open 2018 Lighting /// 组合数递推 二进制
题目大意:
给定n k 给定一个数的二进制位a[]
求这个数加上 另一个二进制位<=n的数b 后
能得到多少个不同的 二进制位有k个1 的数
10 5
1000100111
b取值范围是 0000000000~1111111111
所以 c取值范围是 1000100111~11000100110
也就是求在这个范围里 有5个1的数 有多少个
要让数变大 考虑把0变为1 这样变化能保证得到的数绝对变大
对于第一个0
此时遇到了1 即到了10001xxxxx
因为要保证>= 1000100111
所以1必须固定不能变换
那么 继续看下一个0
100010xxxx 变为 100011xxxx
方案数是C(4,2)
1000100xxx 变为 1000101xxx
方案数是C(3,2)
然后1000100111本身也是一种方案
会发现其实就是在0位累加组合数
1 0 0 0 1 0 0 1 1 1
C(8,3)+C(7,3)+C(6,3) +C(4,2)+C(3,2) +1(本身)
所以10位的可能方案有 56+35+20+6+3+1=121
要让数变小 就考虑把1变为0
因为必须保证11位 所以默认第一位为1
对于第二个1
11xxxxxxxxx 变为 10xxxxxxxxx
剩下的x中需要再有4个1 所以方案数是C(9,4)
对于第三个1
110001xxxxx 变为 110000xxxxx
方案数是C(5,3)
对于第四个1
110001001xx 变为 110001000xx
方案数是C(2,2)
对于第五个1
1100010011x 变为 1100010000x
方案数是C(1,1)
然后11000100110本身也是一种方案
1 1 0 0 0 1 0 0 1 1 0
C(9,4) +C(5,3) +C(2,2)+C(1,1) +1(本身)
所以11位的可能方案有 126+20+1+1+1=149
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LL long long
#define mem(i,j) memset(i,j,sizeof(i))
#define inc(i,j,k) for(int i=j;i<=k;i++)
#define dec(i,j,k) for(int i=j;i>=k;i--)
const int N=1e3+;
const int mod=1e9+; int n,k,a[N];
char s[N];
LL C[N][N]; void init() {
C[][]=C[][]=C[][]=1LL;
inc(i,,N-) {
C[i][]=1LL;
inc(j,,i-) {
C[i][j]=(C[i-][j-]+C[i-][j])%mod;
}
C[i][i]=1LL;
}
} int main()
{
init();
while(~scanf("%d%d%s",&n,&k,s)) {
int cnt=;
inc(i,,n-) {
if(s[i]=='')a[i]=;
else a[i]=, cnt++;
} if(k==) {
if(cnt==) printf("1\n");
else printf("0\n"); continue;
}
if(cnt==) {
printf("%d\n",C[n][k]); continue;
} LL ans=;
int U=k-, D=n-;
inc(i,,n-) {
if(U<) break;
if(a[i]==) U--;
else ans=(ans+C[D][U])%mod;
D--;
}
if(cnt<=k) ans=(ans+1LL)%mod; // 本身 reverse(a,a+n);
inc(i,,n-) {
a[i]+=;
if(a[i]>) a[i+]++;
a[i]%=;
}
reverse(a,a+n+); U=k-, D=n-;
inc(i,,n) {
if(U==) break;
if(a[i]==) {
ans=(ans+C[D][U])%mod;
U--;
}
D--;
}
cnt=;
inc(i,,n) if(a[i]==) cnt++;
if(cnt>=k) ans=(ans+1LL)%mod; // 本身 printf("%lld\n",ans);
} return ;
}
CTU Open 2018 Lighting /// 组合数递推 二进制的更多相关文章
- loj #6261 一个人的高三楼 FFT + 组合数递推
\(\color{#0066ff}{ 题目描述 }\) 一天的学习快要结束了,高三楼在晚自习的时候恢复了宁静. 不过,\(HSD\) 桑还有一些作业没有完成,他需要在这个晚自习写完.比如这道数学题: ...
- Codeforces 631 (Div. 2) D. Dreamoon Likes Sequences 位运算^ 组合数 递推
https://codeforces.com/contest/1330/problem/D 给出d,m, 找到一个a数组,满足以下要求: a数组的长度为n,n≥1; 1≤a1<a2<⋯&l ...
- UVA1635 Irrelevant Elements(唯一分解定理 + 组合数递推)
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51196 紫书P320; 题意:给定n个数a1,a2····an,依次求出相邻 ...
- UVa 10253 (组合数 递推) Series-Parallel Networks
<训练之南>上的例题难度真心不小,勉强能看懂解析,其思路实在是意想不到. 题目虽然说得千奇百怪,但最终还是要转化成我们熟悉的东西. 经过书上的神分析,最终将所求变为: 共n个叶子,每个非叶 ...
- hdu2068 RPG的错排 组合数/递推
#include<stdio.h> ]; long long c(int a,int b) { ,j; ;i>=a-b+,j<=b;i--,j++) sum=sum*i/j; ...
- 紫书 例题 10-14 UVa 12034(组合数+递推)
这道题有点类似动态规划,设答案为f(n) 第一个人有i个人,就有c(n,i)种可能 然后后面有f(n-i)种可能,所以相乘,然后枚举所有可能加起来就ok了. #include<cstdio> ...
- Leetcode 118 Pascal's Triangle 数论递推
杨辉三角,即组合数 递推 class Solution { vector<vector<int>> v; public: Solution() { ; i < ; ++i ...
- 【(好题)组合数+Lucas定理+公式递推(lowbit+滚动数组)+打表找规律】2017多校训练七 HDU 6129 Just do it
http://acm.hdu.edu.cn/showproblem.php?pid=6129 [题意] 对于一个长度为n的序列a,我们可以计算b[i]=a1^a2^......^ai,这样得到序列b ...
- CJOJ 2255 【NOIP2016】组合数问题 / Luogu 2822 组合数问题 (递推)
CJOJ 2255 [NOIP2016]组合数问题 / Luogu 2822 组合数问题 (递推) Description 组合数\[C^m_n\]表示的是从n个物品中选出m个物品的方案数.举个例子, ...
随机推荐
- AR/VR增强现实 虚拟现实,嵌入式解决方案探讨
AR/VR增强现实 虚拟现实,嵌入式解决方案探讨 北京太速科技有限公司 视频增强现实产品与视频矩阵拼接等产品开发,增强现实技术包含了多媒体.三维建模.实时视频显示及控制.多传感器融合.实时跟踪及注册. ...
- day02 循环、格式化输出、运算符、编码
01 昨日内容回顾 python2x python3x区别: python2x:源码重复,不规范. python3x:源码规范,优美,清晰,简单. 编译型:将代码一次性全部转化成字节码. 代表语言:C ...
- 微信小程序(3)--页面跳转和提示框
微信小程序页面跳转方法: 1.<navigator url="../test/test"><button>点我可以切换可以返回</button> ...
- 事件日期转BCD码
BCD码 BCD码 BCD码 射频卡编码方式
- rabbit 独占队列
std::string queue_name = "hello"; AmqpClient::Channel::ptr_t channel = AmqpClient::Channel ...
- [BZOJ4316]小C的独立集 仙人掌?
题目链接 因为xls让我每周模拟一次,然后学习模拟中没有学过的东西.所以就来学圆方树. 本来这道题用不着圆方树,但是圆方树是看yyb的博客学的,他在里面讲一下作为一个引子,所以也来写一下. 首先来Ta ...
- ubuntu 自带截图工具快捷键盘
PrtSc – 获取整个屏幕的截图并保存到 Pictures 目录. Shift + PrtSc – 获取屏幕的某个区域截图并保存到 Pictures 目录. Alt + PrtSc –获取当前窗口的 ...
- Hadoop搭建完全分布式
ubuntu系统下: https://blog.csdn.net/u014636511/article/details/80171002 centos系统下: https://blog.csdn.ne ...
- MySQL查询执行路径
1.客户端发送一条查询给服务器2.服务器先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果.3.服务器端进行SQL解析.预处理,再由优化器生成对应的执行计划.4.MySQL根据优化器生成的执行 ...
- JAVA工具类--手机号生成与正则校验
package utils; import java.util.Random; import java.util.regex.Pattern; /** * Created with IntelliJ ...