E - Round Numbers
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstring> 5 #include <string> 6 7 using namespace std; 8 const int maxn = 2*1e9+5; 9 int dp[100][100]; 10 int a[100]; 11 12 //lead是否有前导0 13 int dfs(int pos,int sta, int lead, bool limit){ 14 if(pos == -1) 15 return sta >= 32; 16 if(!limit && !lead && dp[pos][sta] != -1) 17 return dp[pos][sta]; 18 int up = limit?a[pos]:1; 19 int ans = 0; 20 for(int i = 0;i <= up;i++){ 21 if(lead && i == 0) 22 ans += dfs(pos-1, sta, lead, limit && a[pos] == i); //有前导0的就不统计在内 23 else{ 24 ans += dfs(pos-1, sta + (i == 0?1:-1),lead && i == 0,limit && a[pos] == i); 25 } 26 } 27 //无限制,切无前导0 28 if(!limit && !lead) 29 dp[pos][sta] = ans; 30 return ans; 31 } 32 33 int solve(int x){ 34 int pos = 0; 35 while(x){ 36 a[pos++] = x&1; 37 x >>= 1; 38 } 39 //32当作0使用 40 return dfs(pos-1, 32, true, true); 41 } 42 43 int main(){ 44 memset(dp, -1, sizeof(dp)); 45 int a, b; 46 while(~scanf("%d%d", &a, &b)){ 47 int ans = solve(b) - solve(a-1); 48 printf("%d\n", ans); 49 } 50 return 0; 51 }