我是天下第一唐氏,这题调了一天了,调的我相似
悬赏双号关注+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