您的位置:首页 > 其它

【Codeforces776G】Sherlock and the Encrypted Data

2017-12-19 16:00 387 查看

题意:

设x的16进制表示为xn−1⋯x1x0,那么设h(x)=2xn−1|2xn−2|⋯2x1|2x0,求区间[l,r]中满足x xor h(x)<x的数的个数。

题解:

显然只跟最后几位有关,就是一个16进制的数位dp。

用记忆化搜索的方式,dfs(x,y,z,flag)表示目前到第x位,各位的最大值为y,最后16位的和到现在的值为z,flag表示是否贴紧上限。

代码:

#include <bits/stdc++.h>
#define gc getchar()
#define ll long long
#define N 16
using namespace std;
int a
;
ll dp

[1<<N];
ll dfs(int x,int y,int z,int flag)
{
if (x==0) return z>>y&1;
if (!flag&&dp[x][y][z]!=-1) return dp[x][y][z];
ll ret=0;
int lim=(flag?a[x]:15);
for (int i=0;i<=lim;i++)
ret+=dfs(x-1,max(y,i),(x<=4)?(z|(i<<((x-1)<<2))):z,flag&&(i==lim));
if (!flag) dp[x][y][z]=ret;
return ret;
}
ll solve(ll now)
{
if (now<0) return 0;
int n=0;
while (now)
{
a[++n]=now%16;
now>>=4;
}
return dfs(n,0,0,1);
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int q;
memset(dp,-1,sizeof(dp));
cin>>q;
while (q--)
{
ll l,r;
cin>>hex>>l>>hex>>r;
cout<<solve(r)-solve(l-1)<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐