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; } }
没有人不辛苦,只有人不喊疼