蓝桥杯 二进制问题

简介: 蓝桥杯 二进制问题
#include<bits/stdc++.h>
using namespace std;
vector<int> a(70);
long long N, K;
vector<vector<vector<long long>>> dp(70, vector<vector<long long>>(70, vector<long long>(2, -1)));
long long dfs(int pos, long long count, int num, int limit)
{
    if (pos == -1)
    {
        return count == K;
    }
    if (!limit && dp[pos][count][num] != -1)
    {
        return dp[pos][count][num];
    }
    int upper = limit ? a[pos] : 1;
    long long res = 0;
    for (int i = 0; i <= upper; i++)
    {
        res += dfs(pos - 1, count + (i == 1), i, limit && i == upper);
    }
    if (!limit)
    {
        dp[pos][count][num] = res;
    }
    return res;
}
long long solve(long long x)
{
    int pos = 0;
    while (x)
    {
        a[pos++] = x & 1;
        x >>= 1;
    }
    return dfs(pos - 1, 0, 0, 1);
}
int main()
{
    cin >> N >> K;
    cout << solve(N);
    return 0;
}
目录
相关文章
|
7月前
|
算法 Java C语言
蓝桥杯-03-蓝桥杯学习计划
蓝桥杯-03-蓝桥杯学习计划
|
机器学习/深度学习 Java C++
蓝桥杯带刷,带刷!!!(二)
蓝桥杯带刷,带刷!!!
蓝桥杯带刷,带刷!!!(二)
|
人工智能 C语言
蓝桥杯 ADV_302 秘密行动
蓝桥杯 ADV_302 秘密行动
92 0
蓝桥杯 ADV_302 秘密行动
|
机器学习/深度学习
|
机器学习/深度学习 人工智能
|
机器学习/深度学习 测试技术
|
机器学习/深度学习 人工智能
蓝桥杯带刷,带刷!!!(一)
蓝桥杯带刷,带刷!!!
|
机器学习/深度学习
蓝桥杯刷题(一)
蓝桥杯刷题
110 0