题目大意:

给定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. 20191114PHP验证码

    <?phpob_clean();$img=imagecreate(40,20);$back=imagecolorallocate($img,200,200,200); $blue=imageco ...

  2. route - 显示 / 操作IP选路表

    总览 SYNOPSIS route [-CFvnee] route [-v] [-A family] add [-net|-host] target [netmask Nm] [gw Gw] [met ...

  3. hadoop1.2.1配置与运行子串统计程序

    一.虚拟机版本 VirtualBox-4.3.30 二.操作系统 CentOS-6.7-x86_64-bin-DVD1.iso 下载地址1:http://www.centoscn.com/Centos ...

  4. 【串线篇】SQL映射文件-resultMap自定义封装

    mybatis默认封装规则: 1).按照列明和属性名一一对应的规则(不区分大小写) 2).如果不一一对应: 1).开启驼峰命名(数据库aaa_bbb, 程序中aaaBbb) 2).起别名 3).自定义 ...

  5. XML及XML的解析

    XML的用途 充当显示数据(以XML充当显示层) 存储数据的功能 以XML描述数据,并在联系服务器与系统的其余部分之间传递.(传输数据的一种格式),从某种角度来讲,XML是数据封装和消息传递技术 SA ...

  6. js中require()的用法----JS如何连接数据库执行sql语句或者建立数据库连接池

    var vue = require('vue'); 引入vue的意思,commonjs的写法.node都是用require来载入模块的,可以看看webpack+vue. require()可以调用模块 ...

  7. 【leetcode】623. Add One Row to Tree

    题目如下: Given the root of a binary tree, then value v and depth d, you need to add a row of nodes with ...

  8. .Net Core 使用Redis进行数据缓存

    1.运行环境 开发工具:Visual Studio 2017 JDK版本:.NET Core 2.0 项目管理工具:nuget 2.GITHUB地址 https://github.com/nbfujx ...

  9. 迅捷路由器FW325R的无线桥接

    1.恢复路由器默认设置 长按路由器后面的按钮直到指示灯全亮后只剩一个灯亮时松开按钮,此时就已经重置路由器了.然后设置路由器后台密码什么的,那些向导什么的可以跳过 2.高级设置内容 进入路由器高级设置: ...

  10. vue开发微信公众号--开发准备

    由于工作项目的原因,需要使用vue开发微信公众号,但是这种微信公众号更多是将APP套了一个微信的壳子,除了前面的授权和微信有关系以外,其他的都和微信没多大的关系了,特此记录 开发流程 首先需要在电脑上 ...