Codeforces#247 (Div.2) D - Random Task 组合数

本文介绍了一种使用二进制表示和组合数学的方法来解决特定问题:找到一个数n,使得n + 1到2n之间的整数集合中恰好有m个数的二进制表示包含k个1。文章提供了两种解决方案:一种是通过二分查找,另一种是利用组合数的性质进行构造。
摘要由CSDN通过智能技术生成

链接点击打开链接

题意:找到一个数n,使得n + 1n + 2, ..., n这n个数的集合中有且仅有m个:其二进制表示中包含k个1

题解:1. 首先二分答案肯定是可行的,因为数n -> n+1的时候,集合的数减少了一个n+1,多了一个2n+1和2n+2,而2n+2的二进制中包含1的个数和n+1是一样的,所以所求的答案对n是单调增的。二分n然后判断可行性就行了。

            2. 第二种解法是用组合数,考虑f(n,k)是所有小于n的数中包含k个1的数的个数

假设n的二进制中有r个1,分别在a1,a2,...,ar 位置。 

1. 如果a1(最高位的1)换成0,那么剩下的位随意放k个1即可满足所求,共C(a1, k)种

2. 如果a1仍位1,a2所在的位置换成0,a2往后的位随意放k-1个满足所求, 共C(a2, k-1)种

......

于是f(n,k) = C(a1, k) + C(a2, k-1) + C(a3, k-2) + .... + C(a k+1, 0);

很容易发现n变成2n的话就是组合数的每个底加了1

f(2n,k) = C(a1+1, k) + C(a2+1, k-1) + C(a3+1, k-2) + .... + C(a k+1 +1, 0);

题目即要使得:f(2n,k) - f(n,k) == m

这个推一下公式就发现是sigma(C(ai-1, k-i+1)) == m.

于是就可以构造了,每次取一个小于m的最大的C(i, k),把第i位放成1,然后k-1,直到k == 0为止


#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;

typedef unsigned long long LL;
typedef pair<LL,int> P;

const int N = 60;
LL n;
int k;
LL C[N][N];
set<P> vec[N];
set<P>::iterator ite;
bool vis[N];

void solve()
{
    int kk = k-1;
    LL ans = 0;
    if(n == 0 && k != 1){
        ans = 1;
    }
    while(n){
        ite = vec[kk].upper_bound(make_pair(n,100));
        --ite;
        ite = vec[kk].lower_bound(make_pair((*ite).first, 0));
        vis[(*ite).second] = 1;
        n -= (*ite).first;
        vec[kk].erase(ite);
        kk--;
    }
    for(int i = 0 ;i < N ; i++){
        if(vis[i]){
            ans += ((LL)1 << i);
        }
    }
    cout << ans << endl;
}
int main()
{
    memset(C,0,sizeof(C));
    C[0][0] = 1;
    vec[0].insert(make_pair(C[0][0],0));
    for(int i = 1 ; i < N ; i ++){
        C[i][0] = 1;
        vec[0].insert(make_pair(C[i][0],i));
        for(int j = 1 ;j <= i ; j ++){
            C[i][j] = C[i][j-1] * (i-j+1) / j;
            vec[j].insert(make_pair(C[i][j],i));
        }
    }
    cin >> n >> k;
    solve();
    return 0;
}



weixin073智慧旅游平台开发微信小程序+ssm后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
python017基于Python贫困生资助管理系统带vue前后端分离毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
weixin102旅游社交微信小程序+ssm后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值