悬关注+rmb求调基础数位dp
  • 板块学术版
  • 楼主Kniqht
  • 当前回复7
  • 已保存回复7
  • 发布时间2023/11/10 15:55
  • 上次更新2023/11/10 18:49:15
查看原帖
悬关注+rmb求调基础数位dp
315205
Kniqht楼主2023/11/10 15:55

我是天下第一唐氏,这题调了一天了,调的我相似

悬赏双号关注+5块钱,加微信给

真的完全无法理解问题出在哪里

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=40;
ll f[N][3][3];
int n,a[N];
bool chk(int a,int b,int c){
	return (!a&&!b&&!c)||(a==1&&b==1&&c==1); 
}
ll dfs(int pos,int lead,int p1,int p2,int limit,int res){
	if(!pos) return res;
	if(!lead&&!limit&&f[pos][p1][p2]!=-1) return f[pos][p1][p2];
	int up=limit?a[pos]:1,ans=0;
	for(int i=0;i<=up;i++){
		if(lead&&!i) ans+=dfs(pos-1,1,2,2,limit&&(i==up),res);
		else ans+=dfs(pos-1,0,i,p1,limit&&(i==up),res||chk(i,p1,p2));
	}
	if(!limit&&!lead&&p1!=2&&p2!=2) return f[pos][p1][p2]=ans;
	return ans;
}
ll dp(ll x){
	if(!(~x)||!x) return 0;
	memset(f,-1,sizeof(f));
	n=0;
	while(x) a[++n]=x&1,x>>=1;
	return dfs(n,1,2,2,1,0);
}
signed main(){
	ll l,r;scanf("%lld%lld",&l,&r);
	printf("%lld",dp(r)-dp(l-1));
	return 0;
}

虽然我知道数位dp有各种乱七八糟的写法,我这个是类似这个windy数题解的写法:https://www.luogu.com.cn/blog/virus2017/solution-p2657

2023/11/10 15:55
加载中...