1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 7 int n,m; 8 int num[40],dp[40][80]; //表示第i个位置,0的个数减去1的个数的差值 9 10 int DFS(int pos,int res,bool ok,bool F){11 if(pos==-1) return res>=32;12 if(!F&&!ok&&dp[pos][res]!=-1) return dp[pos][res];13 14 int maxv=F?num[pos]:1;15 int ans=0;16 for(int i=0;i<=maxv;i++){17 if(ok&&i==0) ans=ans+DFS(pos-1,res,ok,F&&i==maxv);18 else ans=ans+DFS(pos-1,res+(i==0?1:-1),ok&&i==0,F&&i==maxv);19 }20 21 if(!F&&!ok) dp[pos][res]=ans;22 return ans;23 } 24 25 int Solve(int temp){26 if(!temp) return 1;27 int cnt=0;28 while(temp){29 num[cnt++]=temp%2;30 temp/=2;31 }32 memset(dp,-1,sizeof(dp));33 return DFS(cnt-1,32,true,true); //为了避免产生负数,所以哈希一下,都加上3234 }35 36 int main()37 { 38 while(~scanf("%d%d",&n,&m)) cout< <