zoukankan      html  css  js  c++  java
  • BZOJ_1662_[Usaco2006 Nov]Round Numbers 圆环数_数位DP

    BZOJ_1662_[Usaco2006 Nov]Round Numbers 圆环数_数位DP

    Description

    正如你所知,奶牛们没有手指以至于不能玩“石头剪刀布”来任意地决定例如谁先挤奶的顺序。她们甚至也不能通过仍硬币的方式。 所以她们通过"round number"竞赛的方式。第一头牛选取一个整数,小于20亿。第二头牛也这样选取一个整数。如果这两个数都是 "round numbers",那么第一头牛获胜,否则第二头牛获胜。 如果一个正整数N的二进制表示中,0的个数大于或等于1的个数,那么N就被称为 "round number" 。例如,整数9,二进制表示是1001,1001 有两个'0'和两个'1'; 因此,9是一个round number。26 的二进制表示是 11010 ; 由于它有2个'0'和 3个'1',所以它不是round number。 很明显,奶牛们会花费很大精力去转换进制,从而确定谁是胜者。 Bessie 想要作弊,而且认为只要她能够知道在一个指定区间范围内的"round numbers"个数。 帮助她写一个程序,能够告诉她在一个闭区间中有多少Hround numbers。区间是 [start, finish],包含这两个数。 (1 <= Start < Finish <= 2,000,000,000)

    Input

    * Line 1: 两个用空格分开的整数,分别表示Start 和 Finish。

    Output

    * Line 1: Start..Finish范围内round numbers的个数

    Sample Input

    2 12

    Sample Output

    6


     设f[i][j]为i位数中有j个1的方案数,然后发现这就是组合数。

    枚举每一位都可能是什么,如果是1就算出这位是0时的方案。

    需要记录下前缀1的个数,这样。

    代码:

    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    int f[35][35],g[35],a[35],tot;
    void init() {
        int i,j,k;
        for(i=0;i<=32;i++) f[i][0]=f[i][i]=1;
        for(i=1;i<=32;i++) {
            for(j=1;j<=i;j++) {
                f[i][j]=f[i-1][j-1]+f[i-1][j];
            }
        }
    }
    void build(int x) {
        if(!x) return ;
        a[++tot]=x%2;
        build(x/2);
    }
    int calc(int x) {
        if(!x) return 1;
        tot=0; build(x);
        int i,j,re=0,tmp=1;
        for(i=1;i<=tot-2;i++) {
            for(j=0;j-(i-j)+tmp<=0;j++) {
                re+=f[i][i-j];
            }
        }
        for(j=tot-1;j;j--) {
            if(a[j]==1) {
                tmp--;
                for(i=0;j-1-i>=0&&i-(j-1-i)+tmp<=0;i++) re+=f[j-1][j-1-i];
                tmp+=2;
            }
            else tmp--;
        }
        if(tmp<=0) re++;
        return re+1;
    }
    int main() {
        init();
        int l,r;
        scanf("%d%d",&l,&r);
        printf("%d
    ",calc(r)-calc(l-1));
    }
    
  • 相关阅读:
    cf D. Vessels
    cf C. Hamburgers
    zoj 3758 Singles' Day
    zoj 3777 Problem Arrangement
    zoj 3778 Talented Chef
    hdu 5087 Revenge of LIS II
    zoj 3785 What day is that day?
    zoj 3787 Access System
    判断给定图是否存在合法拓扑排序
    树-堆结构练习——合并果子之哈夫曼树
  • 原文地址:https://www.cnblogs.com/suika/p/8967669.html
Copyright © 2011-2022 走看看