Round Numbers
题目大意:
输入两个十进制正整数a和b,求闭区间[a,b]内有多少个Round Number?
所谓的Round Number就是一个把十进制数转换成一个无符号二进制数,若该二进制数中0的个数大于等于1的个数,则它就是一个Round Number。
注意 转换所得的二进制数,最高位必然是1,最高位前不允许有0
/* 以前用的组合数学,听说dalao也用数位dp做,我也来一下 */ #include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,dp[40][100],len,a[40]; int dfs(int pos,int sta,int lead,int limit){ if(pos==0)return sta>=32; if(!limit&&!lead&&dp[pos][sta]!=-1)return dp[pos][sta]; int end=limit?a[pos]:1; int ans=0; for(int i=0;i<=end;i++){ if(lead&&i==0)ans+=dfs(pos-1,sta,lead,limit&&i==end); else ans+=dfs(pos-1,sta+(i==0?1:-1),lead&&i==0,limit&&i==end); } if(!limit&&!lead)dp[pos][sta]=ans; return ans; } int solve(int x){ len=0; while(x){ a[++len]=x&1; x>>=1; } return dfs(len,32,1,1); } int main(){ memset(dp,-1,sizeof(dp)); scanf("%d%d",&n,&m); printf("%d",solve(m)-solve(n-1)); }