POJ 3252 Round Numbers(数位dp,区间中二进制表示时0的个数大于等于1的个数的数字的个数)

原创 2016年08月31日 00:26:00

题目链接:
POJ 3252 Round Numbers
题意:
给一个区间[a,b]求区间中二进制表示时0的个数大于等于1的个数的数字的个数。
数据范围:ab2109
分析:
数位dp。
做区间减法后,将区间上限表示成二进制形式,dfs处理。记录下当前已有0和1的个数即可。注意剪枝。

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
typedef long long ll;

int digit[35];
ll dp[35][35][35][2];

ll dfs(int pos, int zero, int one, int first, int limit)
{
    if (pos == -1) return zero >= one;
    if (pos + 1 + zero < one) return 0;
    if (!limit && dp[pos][zero][one][first] != -1) return dp[pos][zero][one][first];
    int last = limit ? digit[pos] : 1;
    ll ret = 0;
    for (int i = 0; i <= last; ++i) {
        if (i == 0) {
            int next_zero = zero + 1;
            if (first) next_zero = 0;
            ret += dfs(pos - 1, next_zero, one, first, limit && (i == last));
        } else ret += dfs(pos - 1, zero, one + 1, 0, limit && (i == last));
    }
    if (!limit) dp[pos][zero][one][first] = ret;
    return ret;
}

ll solve(ll x)
{
    memset(dp, -1, sizeof(dp));
    memset(digit, 0, sizeof(digit));
    int len = 0;
    while (x) {
        digit[len++] = x % 2;
        x /= 2;
    }
    return dfs(len - 1, 0, 0, 1, 1);
}

int main()
{
    ll L, R;
    while (~scanf("%lld%lld", &L, &R)) {
        printf("%lld\n", solve(R) - solve(L - 1));
    }
    return 0;
}
版权声明:缥缈玉京人,想语然、京兆眉妩。

[ACM] POJ 3252 Round Numbers (一个区间内二进制中0的个数大于等于1的个数有多少个,组合)

Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8590   ...

poj3252 数位dp(所有比n小的二进制位0的个数不少于1的个数)记忆化搜索

http://poj.org/problem?id=3252 Description The cows, as you know, have no fingers or thumbs an...

POJ 3252 Round Numbers (二进制数位dp)

题意: 求[l,r]区间里满足转化成二进制后“0”个数比“1”多的数的个数求[l,r]区间里满足转化成二进制后“0”个数比“1”多的数的个数 分析: 破题想了2天,老想着填0→9,想了几个状态...
  • lwt36
  • lwt36
  • 2015年10月22日 00:36
  • 213

Codeforces 55D Beautiful Numbers(数位dp,能被自己各个位上数字整除的数字个数)

题目链接: Codeforces 55D Beautiful Numbers 题意: 定义:一个数如果能够被它所有位上非零数字整除那么这个数就是Beautiful Numbers。 给一个区间...
  • Ramay7
  • Ramay7
  • 2016年08月29日 18:48
  • 197

POJ-3252 Round Numbers (数位DP)

写完后看了很多题解,发现大家用数位DP都要用dfs,感觉直接循环也很好理解啊... 设dp[i][j][0]表示长度为i,含有j个0且最高位为0的数字的个数;dp[i][j][1]表示长度为i,含有j...

POJ 3252 Round Numbers (组合数学+数位dp)

Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13888   Accepted: 5...

POJ 3252 Round Numbers(数位dp)

Language: Default Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total ...

POJ 3252 Round Numbers 数位DP

Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13448   Accepted: 5...

poj3252 Round Numbers (数位dp)

Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, ...

poj 3252 Round Numbers(数位dp)

Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9889   ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 3252 Round Numbers(数位dp,区间中二进制表示时0的个数大于等于1的个数的数字的个数)
举报原因:
原因补充:

(最多只允许输入30个字)