题目大意:

给定n k 给定一个数的二进制位a[]

求这个数加上 另一个二进制位<=n的数b 后

能得到多少个不同的 二进制位有k个1 的数

样例
input
10 5
1000100111
output
13
10位的a 和 10位的b 相加得到c 
b取值范围是 0000000000~1111111111
所以 c取值范围是 1000100111~11000100110

也就是求在这个范围里 有5个1的数 有多少个

 
在这个取值范围里考虑两种情况
10位时>= 1000100111
11位时<=11000100110
 
(1)10位时>= 1000100111

要让数变大 考虑把0变为1 这样变化能保证得到的数绝对变大

对于第一个0

10xxxxxxxx 变为11xxxxxxxx 
x里必须再有3个1才能符合5个1的要求 所以方案数是 C(8,3)
对于第二个0  100xxxxxxx 变为101xxxxxxx 
方案数是C(7,3)
对于第三个0  1000xxxxxx 变为1001xxxxxx
方案数是 C(6,3)

此时遇到了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

(2)11位时<=11000100110

要让数变小 就考虑把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  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 /// 组合数递推 二进制的更多相关文章

  1. loj #6261 一个人的高三楼 FFT + 组合数递推

    \(\color{#0066ff}{ 题目描述 }\) 一天的学习快要结束了,高三楼在晚自习的时候恢复了宁静. 不过,\(HSD\) 桑还有一些作业没有完成,他需要在这个晚自习写完.比如这道数学题: ...

  2. 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 ...

  3. UVA1635 Irrelevant Elements(唯一分解定理 + 组合数递推)

    http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51196 紫书P320; 题意:给定n个数a1,a2····an,依次求出相邻 ...

  4. UVa 10253 (组合数 递推) Series-Parallel Networks

    <训练之南>上的例题难度真心不小,勉强能看懂解析,其思路实在是意想不到. 题目虽然说得千奇百怪,但最终还是要转化成我们熟悉的东西. 经过书上的神分析,最终将所求变为: 共n个叶子,每个非叶 ...

  5. hdu2068 RPG的错排 组合数/递推

    #include<stdio.h> ]; long long c(int a,int b) { ,j; ;i>=a-b+,j<=b;i--,j++) sum=sum*i/j; ...

  6. 紫书 例题 10-14 UVa 12034(组合数+递推)

    这道题有点类似动态规划,设答案为f(n) 第一个人有i个人,就有c(n,i)种可能 然后后面有f(n-i)种可能,所以相乘,然后枚举所有可能加起来就ok了. #include<cstdio> ...

  7. Leetcode 118 Pascal's Triangle 数论递推

    杨辉三角,即组合数 递推 class Solution { vector<vector<int>> v; public: Solution() { ; i < ; ++i ...

  8. 【(好题)组合数+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 ...

  9. CJOJ 2255 【NOIP2016】组合数问题 / Luogu 2822 组合数问题 (递推)

    CJOJ 2255 [NOIP2016]组合数问题 / Luogu 2822 组合数问题 (递推) Description 组合数\[C^m_n\]表示的是从n个物品中选出m个物品的方案数.举个例子, ...

随机推荐

  1. AR/VR增强现实 虚拟现实,嵌入式解决方案探讨

    AR/VR增强现实 虚拟现实,嵌入式解决方案探讨 北京太速科技有限公司 视频增强现实产品与视频矩阵拼接等产品开发,增强现实技术包含了多媒体.三维建模.实时视频显示及控制.多传感器融合.实时跟踪及注册. ...

  2. day02 循环、格式化输出、运算符、编码

    01 昨日内容回顾 python2x python3x区别: python2x:源码重复,不规范. python3x:源码规范,优美,清晰,简单. 编译型:将代码一次性全部转化成字节码. 代表语言:C ...

  3. 微信小程序(3)--页面跳转和提示框

    微信小程序页面跳转方法: 1.<navigator url="../test/test"><button>点我可以切换可以返回</button> ...

  4. 事件日期转BCD码

    BCD码 BCD码 BCD码 射频卡编码方式

  5. rabbit 独占队列

    std::string queue_name = "hello"; AmqpClient::Channel::ptr_t channel = AmqpClient::Channel ...

  6. [BZOJ4316]小C的独立集 仙人掌?

    题目链接 因为xls让我每周模拟一次,然后学习模拟中没有学过的东西.所以就来学圆方树. 本来这道题用不着圆方树,但是圆方树是看yyb的博客学的,他在里面讲一下作为一个引子,所以也来写一下. 首先来Ta ...

  7. ubuntu 自带截图工具快捷键盘

    PrtSc – 获取整个屏幕的截图并保存到 Pictures 目录. Shift + PrtSc – 获取屏幕的某个区域截图并保存到 Pictures 目录. Alt + PrtSc –获取当前窗口的 ...

  8. Hadoop搭建完全分布式

    ubuntu系统下: https://blog.csdn.net/u014636511/article/details/80171002 centos系统下: https://blog.csdn.ne ...

  9. MySQL查询执行路径

    1.客户端发送一条查询给服务器2.服务器先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果.3.服务器端进行SQL解析.预处理,再由优化器生成对应的执行计划.4.MySQL根据优化器生成的执行 ...

  10. JAVA工具类--手机号生成与正则校验

    package utils; import java.util.Random; import java.util.regex.Pattern; /** * Created with IntelliJ ...