求助
查看原帖
求助
361726
追梦之鲸楼主2022/11/12 14:42

先放上我的代码:

#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了,当我把它改回来的时候,却保零了。求解答。

2022/11/12 14:42
加载中...