void init() { f[0][0]=1; int i,j; for(i=1;i<=31;i++) { f[i][0]=f[i-1][0]; for(j=1;j<=i;j++) f[i][j]=f[i-1][j]+f[i-1][j-1]; } } int calc(int x,int k)//计算[0 x]里含有k个1的数的个数 { int i; int tol=0,ans=0; for(i=31;i>=0;i--) { if(x&(1<<i)) { x^=(1<<i); ans+=f[i][k-tol]; tol++; if(tol>k) break; } } if(tol+x==k) ans++; return ans; }
|