CF1245F Daniel and Spring Cleaning(数位dp)

这道题求取的本质是二进制不进位加法的队数,因此模型比较常见,因为我们不太会维护有下界的数位dp

所以往往使用容斥原理变成无下界的dp

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const int N=4e6+10;
ll f[40][2][2];
ll L,R;
ll dfs(int u,int sign,int flag){
    if(u==-1)
        return 1;
    auto &x=f[u][sign][flag];
    if(x!=-1)
        return x;
    int upx=sign?(L>>u&1):1;
    int upy=flag?(R>>u&1):1;
    ll ans=0;
    for(int i=0;i<=upx;i++){
        for(int j=0;j<=upy;j++){
            if(!(i&j)){
                ans+=dfs(u-1,sign&&(i==upx),flag&&(j==upy));
            }
        }
    }
    return x=ans;
}
ll solve(int l,int r){
    if(l<0)
        return 0;
    memset(f,-1,sizeof f);
    L=l,R=r;
    return dfs(log2(R+1)+1,1,1);
}
int main(){
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--){
        int l,r;
        cin>>l>>r;
        cout<<solve(r,r)-2*solve(l-1,r)+solve(l-1,l-1)<<endl;
    }
}
View Code

 

posted @ 2020-10-30 23:12  朝暮不思  阅读(112)  评论(0编辑  收藏  举报