codeforces597 div2 F 数位dp
codeforces597 div2 F 数位dp
题意:
求[L,R]中a&b==0的“对数”
思路:
一个典型的求“对数”的数位dp,对比普通的数位dp,共用一个pos,维护两个limit。剩下的就是“暴搜”了,当然注意去重,因为是求对数就不是简单的\(ans_{R}-ans_{L-1}\)了。还有要注意lim的状态也要保存,不然会超时。
代码:
#include
using namespace std;
#define X first
#define Y second
#define PB push_back
#define LL long long
#define pii pair
#define MEM(x,y) memset(x,y,sizeof(x))
#define bug(x) cout<<"debug "#x" is "<>pos)&1):1,up2=lim2?((R>>pos)&1):1;
dp[pos][lim1][lim2]=0;
for(int i=0;i<=up1;i++)for(int j=0;j<=up2;j++)
if((i&j)==0)
dp[pos][lim1][lim2]+=solve(L,R,pos-1,lim1&&i==up1,lim2&&j==up2);
return dp[pos][lim1][lim2];
}
LL do_solve(int l,int r){
if(l<0||r<0) return 0;
MEM(dp,-1);
return solve(l,r,31,1,1);
}
int main(){
FIO;
int t,l,r;
cin>>t;
while(t--){
MEM(dp,-1);
cin>>l>>r;
cout<