题目链接:http://poj.org/problem?id=3252
题目大意:
输入两个十进制正整数a和b,求闭区间 [a ,b] 内有多少个Round number
所谓的Round Number就是把一个十进制数转换为一个无符号二进制数,若该二进制数中0的个数大于等于1的个数,则它就是一个Round Number
规定输入范围: 1<= a <b<=2E
/*
一开始错在计算组合数!!!正解是利用杨辉三角来算!!
另外对于star=1的情况下也需要特判一下子
思路是算出【0,star】和【0,fini】的round number(以下简称rn)个数,后者减去前者+1*【star是rn】(艾弗森约定)
要计算【0,a】的rn个数,设a的二进制表示长度为lena,那么先打表f[]给出二进制表示数长度为1-->lena-1的这些数的rn。
再计算长度为lena的,但是比a小的这些数里头有哪些是rn呢?
计算同长度的rn的思路是:从高位到低位将a的二进制表示中的1(除最高位)逐次变为0,更低位的则在满足rn条件的前提下随便进行排列,得到的数一定是小于a的rn
当然某一位变完了以后又会变回来的啊。这部分详见fun();
*/
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 #define MAX 35 7 #define unsigned int long long 8 long long f[MAX]; 9 long long star,fini; 10 char str0[35],str1[35]; 11 long long c[40][40]; 12 void d2b(long long d, char *str)//十进制转成二进制! 13 { 14 int nStart = -1, i = 0; 15 for (i=0; i<32; i++) 16 { 17 bool bOne = (0 != (d & (1 << (32-i-1) ))); 18 if (bOne && nStart < 0) 19 { 20 nStart = i; 21 } 22 if(nStart>=0) 23 { 24 str[i - nStart] = bOne ? '1' : '0'; 25 } 26 } 27 str[i - nStart] = '