【Codeforces776G】Sherlock and the Encrypted Data

26 篇文章 0 订阅
1 篇文章 0 订阅

题意:

  • x 的16进制表示为xn1x1x0,那么设 h(x)=2xn1|2xn2|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[N];
ll dp[N][N][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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值