先放上我的代码:
#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void Read(T &x) {int f=1;x=0;char c=getchar();for (;!isdigit(c);c=getchar())if(c=='-')f=-1;for (;isdigit(c);c=getchar())x=x*10+(c^48);x*=f;}
const int N = 62;
int cp[N][N];
inline void init() { //预处理组合数
for (int i = 0; i < N; i ++) {
for (int j = 0; j < i; j ++) {
if (!j)
cp[i][j] = 1;
else
cp[i][j] = cp[i - 1][j] + cp[i - 1][j - 1];
}
}
return ;
}
inline int dp(long long n, int k) {
int wet[N], wit, ans = 0, lst = 0;
for (wit = 0; n;) {
wet[++ wit] = n & 1;
n >>= 1;
}
for (int i = wit; i >= 1; i --) {
if (wet[i] == 1) {
ans += cp[i][k - lst];
lst ++;
if (lst > k)
break;
}
if(i == 1 and k == lst) ans ++;
}
return ans;
}
int main() {
init();
long long n;
int k;
Read(n); Read(k);
cout << dp(n, k);
return 0;
}
我在预处理组合数的时候把 j<=i 写成了 j<i。但奇怪的AC了,当我把它改回来的时候,却保零了。求解答。