#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include < cmath> #include <vector> #include <queue> #include <cstring> #include <set> #include < stack> #include <map> #define LL Long Long using namespace Std;int dp[50][50][50];int bit[40];int dfs (int pos,int n Um0,int Num1,bool Flag,bool First) {if (pos = = 0) return NUM0 >= num1;if (!flag && dp[pos][num0][num1]! =-1) retur n dp[pos][num0][num1];int ans = 0;int end = flag? Bit[pos]: 1;for (int i=0;i<=end;i++) {ans + = DFS (pos-1, (first && i = = 0)? 0:NUM0 + (i==0), (first && ; i = = 0)? 0:num1 + (i = = 1), flag && (i = = end), first && (i = = 0));} if (!flag) dp[pos][num0][num1] = Ans;return ans;} int solve (int n) {int len = 0;memset (bit,0,sizeof (bit)), while (n) {Bit[++len] = n & 1;n >>= 1;} Return Dfs (len,0,0,1,1);} int main () {int L, R;while (scanf ("%d%d", &l, &r)!=eof) {memset (DP,-1, sizeof (DP));p rintf ("%d\n ", Solve (R)-Solve (L-1));} return 0;}
POJ 3252 Round numbers (digital DP)