疑惑,关于状态
查看原帖
疑惑,关于状态
365532
Mr_ll楼主2022/11/15 09:02

一开始,想不到应该怎么记录状态,看了一下题解,

f[pos][num0][num1],记录了位置,0的数量,1的数量, 但1001,1100的pos,num0,num1都是相同的,为什么可以呢,代码如下

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#define ll long long
using namespace std;
int cnt,c[101],f[101][101][101];
ll l,r;
ll dfs(int pos,int sum0,int sum1,bool lead,bool limit) {
	if(pos>cnt) {
		if(lead||sum0>=sum1) return 1;
		else return 0;
	}
	if(!lead&&!limit&&f[pos][sum0][sum1]!=-1) return f[pos][sum0][sum1];
	int up=limit?c[cnt-pos+1]:1;
	ll s=0;
	for(int i=0;i<=up;i++) 
		if(i==0&&lead) s+=dfs(pos+1,0,0,1,limit&&(i==up)); 
		else s+=dfs(pos+1,sum0+(i==0),sum1+(i==1),lead&&(i==0),limit&&(i==up));
	if(!lead&&!limit) f[pos][sum0][sum1]=s;
	return s;
}
ll cl(ll x) {
	cnt=0;
	while(x) {
		c[++cnt]=x&1;
		x>>=1;
	}
	memset(f,-1,sizeof(f));
	return dfs(1,0,0,1,1);
}
int main() {
	scanf("%lld%lld",&l,&r);
	printf("%lld\n",cl(r)-cl(l-1));
	return 0;
}
2022/11/15 09:02
加载中...