萌新求助数位dp
查看原帖
萌新求助数位dp
324666
diqiuyi奶龙楼主2022/11/13 22:33

rt,过不了样例

#include <bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0;bool f=1;char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')f=0;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
	return f?x:-x;
}
int l,r,a[35],len,f[35][65]; 
int dfs(int pos,bool qdl,bool limit,int s){
	if(!pos) return s>=30;
	if(!limit&&!qdl&&(~f[pos][s])) return f[pos][s];
	int up=a[pos]|(limit^1);
	f[pos][s]=0;
	for(int i=0;i<=up;i++)
		f[pos][s]+=dfs(pos-1,i?0:qdl,limit&(i==up),s+(i?-1:(qdl?0:1)));
	return f[pos][s];
}
inline int ans(int x){
	len=0;
	while(x)
		a[++len]=(x&1),x>>=1;
	return dfs(len,1,1,30);
}
int main(){
	memset(f,-1,sizeof f);
	l=read(),r=read();
	printf("%d\n",ans(r)-ans(l-1));
    return 0;
}
2022/11/13 22:33
加载中...