求助, 全RE 数位DP
查看原帖
求助, 全RE 数位DP
590571
_weishiqi66_楼主2024/3/4 13:31
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N = 2*1e3+5;
int num[N], n, k;
int f[N][60];

int dfs(int len,int limit,int lead,int jsq) {
	if(len==0)  return jsq==k;
	if(!limit&&lead&&f[len][jsq]!=-1) return f[len][jsq];
	if(jsq>k) return 0;
	int maxx=limit? num[len] : 1;
	int ans=0;
	for(int j=0;j<=maxx;j++) {
		ans+=dfs(len-1,limit&&j==maxx,lead|j,jsq+j);
	}
	if(!limit&&lead) f[len][jsq]=ans;
	return ans;
} 

int work(int x) {
	int len = 0;
	while(x) {
		num[++len] = x&1;	//cout<<len<<endl;
		x >>= 1;
	}
	memset(f,-1,sizeof(f));
	dfs(len,1,0,0);
}

signed main() {
	cin>>n>>k;
	cout<<work(n);
	return 0;
}
2024/3/4 13:31
加载中...