POJ-Round Numbers-组合数学

来源:互联网 发布:premiere软件免费下载 编辑:程序博客网 时间:2024/04/30 10:59

题意;

    给你两个数n,m,让你看里面有多少个round数,(包括m,不包括n)

     round 数是对应的二进制数中0比1的个数多

思路:

    1.0 杨辉三角

    2.0 分阶层去算(不同的数位)1,10,100,1000,这样是4个阶层,先算出p(二进制的数的长度)的所有的,然后再算和p相同长度,但是比该数小的round数

CODE

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<iostream>#include<algorithm>using namespace std;int Cn[33][33];int a[1100],b[1100];void YH()///构建杨辉三角{    int i,j;    for(i=0; i<=32; ++i)    {        Cn[i][0]=Cn[i][i]=1;    }    for(i=2; i<=32; ++i)    {        for(j=1; j<i; ++j)        {            Cn[i][j]=Cn[i-1][j-1]+Cn[i-1][j];        }    }}int round(int p){    int i, j;    int ans = 0;    for(i = 2; i < p; i++)///p位数之前的那些    {        for(j =(i+1)/2; j < i; j++)        {            ans+=Cn[i-1][j];        }    }    int k=0;///统计0的个数    int ki = (p+1)/2;///至少要这些个0    for(i = p-2; i >= 0; i--)///和p位数在同一个阶层    {        if(a[i] == 1)        {            int mi = ki-k-1;///后面至少需要这些0,才是round数            for(; mi <= i; mi++)                ans+=Cn[i][mi];        }        else            k++;    }    return ans;}int main(){    YH();    int n, m;    while(~scanf("%d%d",&n,&m))    {        scanf("%d%d",&n,&m);        int p = 0, q = 0;        m++;///要m那个数,不要n        while(n)///转化为二进制        {            a[p++] = n%2;            n = n/2;        }        int ans = 0, num = 0;        ans = round(p);///n之前的round数        while(m)        {            a[q++] = m%2;            m = m/2;        }        num = round(q);///包括m在内的round数        printf("%d\n",num-ans);    }    return 0;}


0 0
原创粉丝点击