Description

两个数字 x x和yy,它们需要满足 x∨y=T x∨y=T,且 Lx≤x≤Rx Lx≤x≤Rx , Ly≤y≤Ry Ly≤y≤Ry,求 x∧y x∧y有多少种可能的不同的取值。

Data Constraint

0<=T,Lx,Rx,Ly,Ry<261 0

Code

Ps.没开long long炸剩暴力分。
先考虑一下如果没有上下界的限制,那答案为显然为 2bits(T) 2^{bits(T)},其中 bits(T) bits(T)表示二进制下 1 1的个数。

考虑暴力。
暴力枚举可能的x∧yx∧y,从高往低位枚举 x∧y x∧y,假设当前枚举到第 i i位,x∧yx∧y的前i位和枚举出来的前 i i位的(xx, y y)一定有很多对,我们将xx分成四种,分别是 x x的前ii位卡上界,卡下界,上下界都卡,上下界都不卡,同样的 y y也分成四种,那么这些二元组最多能分成1616种。

当递归到某个状态(设当前递归到了第 i i位)发现发现存在一个二元组它的xx和 y y都不卡上下界,那显然剩下的位置可以乱填,因为前i位上下界都不卡的话那后面无论填什么都不可能出上下界了,答案加上2∑wj=i+1Tj2^{\sum_{j=i+1}^wT_j},其中 w w是TT在二进制下的位数。

递归的时候顺便带上一个 216 2^{16}级别的二进制数表示到当前状态下 16 16种中的每种二元组是否存在,转移到下个状态的话随便分类讨论下就好了,加上个记忆化就能很好地保证复杂度了,时间复杂度 O(216w) O(2^{16}w),然而我没加记忆化都能虐暴标程。

Code

/*记忆化什么的不存在的*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>#define fo(i,j,l) for(int i=j;i<=l;++i)
#define fd(i,j,l) for(int i=j;i>=l;--i)using namespace std;
typedef long long ll;
const ll N=80;int w[N];
ll q1[2][N],q2[2][N],p1[2][N],p2[2][N],f[N];
ll d[N][3],m2[N],oo;
int qq[3],pp[3];
ll ans,T,lx,rx,ly,ry;inline int max(int a,int b)
{return a>b?a:b;}inline bool ok1(int po,ll op)
{return (q1[1][po]<=op)&&(q2[1][po]>=op);}inline bool oo1(int po,ll op)
{return (q1[1][po]<op)&&(q2[1][po]>op);}inline bool ok2(int po,ll op)
{return (p1[1][po]<=op)&&(p2[1][po]>=op);}inline bool oo2(int po,ll op)
{return (p1[1][po]<op)&&(p2[1][po]>op);}inline ll judge(ll p)
{return p<0?-1:p;}void dg(int o)
{if(o==0){ans=ans+1; return;}ll v[N][3]; int k=oo;fo(i,1,oo)v[i][1]=d[i][1],v[i][2]=d[i][2];if(w[o]==0){oo=0;fo(i,1,k)if((ok1(o,v[i][1]<<1)||v[i][1]==-1)&&(ok2(o,v[i][2]<<1)||v[i][2]==-1)){d[++oo][1]=judge(v[i][1]*2); d[oo][2]=judge(v[i][2]*2);}if(oo)dg(o-1);}else{oo=0;fo(i,1,k){if((ok1(o,(v[i][1]<<1)^1)||v[i][1]==-1)&&(ok2(o,v[i][2]<<1)||v[i][2]==-1))d[++oo][1]=judge((v[i][1]*2)+1),d[oo][2]=judge(v[i][2]*2);if((ok1(o,v[i][1]<<1)||v[i][1]==-1)&&(ok2(o,(v[i][2]<<1)^1)||v[i][2]==-1))d[++oo][1]=judge(v[i][1]*2),d[oo][2]=judge((v[i][2]*2)+1);}int ok=0;fo(i,1,oo){if(oo1(o,d[i][1]))d[i][1]=-1;if(oo2(o,d[i][2]))d[i][2]=-1;if(d[i][1]+d[i][2]==-2){ok=1; break;}}if(ok==1)ans=ans+m2[f[o-1]];else if(oo)dg(o-1);ok=oo=0;fo(i,1,k)if((ok1(o,(v[i][1]<<1)^1)||v[i][1]==-1)&&(ok2(o,(v[i][2]<<1)^1)||v[i][2]==-1))d[++oo][1]=judge((v[i][1]*2)+1),d[oo][2]=judge((v[i][2]*2)+1);fo(i,1,oo){if(oo1(o,d[i][1]))d[i][1]=-1;if(oo2(o,d[i][2]))d[i][2]=-1;if(d[i][1]+d[i][2]==-2){ok=1; break;}}if(ok==1)ans=ans+m2[f[o-1]];else if(oo)dg(o-1);}oo=k;fo(i,1,oo)d[i][1]=v[i][1],d[i][2]=v[i][2];
}int main()
{cin>>T>>lx>>rx>>ly>>ry;
    m2[0]=1;
    fo(i,1,61)m2[i]=m2[i-1]<<1;
    ll x=T;
    for(;x;x>>=1)w[++w[0]]=x&1;
    x=lx;
    for(;x;x>>=1)q1[0][++qq[1]]=x&1;
    x=rx;
    for(;x;x>>=1)q2[0][++qq[2]]=x&1;
    x=ly;
    for(;x;x>>=1)p1[0][++pp[1]]=x&1;
    x=ry;
    for(;x;x>>=1)p2[0][++pp[2]]=x&1;
    int ws=max(w[0],qq[1]); ws=max(ws,qq[2]);
    ws=max(ws,pp[1]); ws=max(ws,pp[2]);
    fo(i,1,ws)f[i]=f[i-1]+w[i];
    fd(i,ws,1){        q1[1][i]=(q1[1][i+1]<<1)^q1[0][i];
        q2[1][i]=(q2[1][i+1]<<1)^q2[0][i];
        p1[1][i]=(p1[1][i+1]<<1)^p1[0][i];
        p2[1][i]=(p2[1][i+1]<<1)^p2[0][i];
    }
    oo=1;
    d[1][1]=d[1][2]=0;
    dg(ws);
    cout<<ans;
}

JZOJ 5682 数字相关推荐

  1. JZOJ 2032. 数字游戏

    题目 Description FJ和他的奶牛们喜欢玩一种数字游戏:他们按某种顺序在纸上写下1-N(1<=N<=10)之间的所有数,然后把相邻的数字相加,得到一个比原数列少一项的数列.对新数 ...

  2. jsdoc api文档_创建更好的JSDoc文档

    jsdoc api文档 Writing code documentation is one of the most relaxing experiences of my work as a back ...

  3. 【DP】数字游戏(jzoj 2131)

    数字游戏 jzoj 2131 题目大意: 有n个数,每个数有相应的aia_iai​和bib_ibi​,当选了一个数后结果加上aia_iai​,其他数分别减去他们自己的aja_jaj​,现在让你选m个数 ...

  4. JZOJ 5379. 【NOIP2017提高A组模拟9.21】Victor爱数字

    Description Victor 是一名热爱数字的同学.他最近在思考这样一个问题: 一个字符串是回文的当且仅当它倒过来还和原来相同.那么如果一个数的数串没有一个长度超过1 的子串是回文串的话,它就 ...

  5. JZOJ 4467【GDOI2016模拟4.22】数字方阵

    Description Anica 做了一个很奇怪的梦:她梦见了一个无限大的平板,平板上填着无限行和无限列的整数.有趣的是,每个整数在那神奇的平板上只出现有限的次数. 机智的Anica很快便发现了这其 ...

  6. #莫比乌斯反演,乘法逆元,快速幂,整除分块#JZOJ 100006 洛谷 3704 bzoj 4816 数字表格

    题目 求 ∏ i = 1 n ∏ j = 1 m F g c d ( i , j ) \prod_{i=1}^n\prod_{j=1}^mF_{gcd(i,j)} i=1∏n​j=1∏m​Fgcd(i ...

  7. jzoj6451-[2020.01.19NOIP提高组]不幸运数字【记忆化搜索,数位dp,高精度】

    正题 题目链接:https://jzoj.net/senior/#main/show/6451 题目大意 给出a,ba,ba,b,求[a,b][a,b][a,b]这个区间中有多少数字包含444. 解题 ...

  8. 【二分】防具布置/秦腾与教学评估(ybtoj 二分-1-2/jzoj 1253/luogu 4403)

    正题 ybtoj 二分-1-2 jzoj 1253 luogu 4403 题目大意 给出n组数:si,ei,dis_i,e_i,d_isi​,ei​,di​ 对于每组数据,表示在sis_isi​加1, ...

  9. 秀姿势(jzoj 3464)

    秀姿势 jzoj 3464 题目大意 有n个数,每个数都有一个分组,现在问你最多去掉k个分组后,做多有多少个数是连续的同组的 输入样例 9 1 2 7 3 7 7 3 7 5 7 输出样例 4 样例解 ...

最新文章

  1. Git基础命令(一)
  2. 【Android】Android开发初学者实现拨打电话的功能,拨打电话app小demo实现
  3. App 运营的指标具体都有哪些?
  4. mysql三大范式 答案_数据库逻辑设计之三大范式通俗理解,一看就懂,书上说的太晦涩...
  5. Linux 目录文件讲解
  6. 灰度实战(三):Apollo配置中心(3)
  7. opencv kmeans聚类 实现图像色彩量化
  8. JavaWeb之Servlet:Cookie 和 Session
  9. docker 安装最新mysql
  10. 【tensorRT文档翻译】7. Working With Dynamic Shapes
  11. ibm system x服务器重装系统,IBM X346服务器重装系统_xSeries 346阵列配置
  12. idea如何修改配置的Tomcat版本
  13. 【转载】SAP Smartform A5 针式打印机 打印格式横向问题
  14. app开发需要哪些技术?4种app制作方法对比
  15. 【知识图谱】Neo4j 删除、清空数据库的方法
  16. 自定义数据类型的指针的含义
  17. 【Maven打包报错解决方案】Using ‘UTF-8‘ encoding to copy filtered resources.
  18. 查看服务器支持的内存条,PowerEdge 服务器支持的内存配置指南
  19. ESET最近发现了一款新的Android勒索软件,它通过向受害者的手机的联系人列表发送恶意短信继续传播
  20. 使用redis的setnx可以非同一线程进行加锁和解锁(附源码)

热门文章

  1. 软件工程OOAD(面向对象的分析与设计)概念整理
  2. 基于Halcon学习的一维码识别【四】barcode.param_contrast.hdev
  3. HTTP的前世与今生
  4. var声明与变量提升
  5. 高通机型刷机包的分区解析 了解分区基本常识
  6. 【数据库】关系代数基本运算
  7. 旅行社门店建立旅游小程序解决方案
  8. 为视频直播网站开发选择最佳技术
  9. 数据结构-二叉树(统计二叉树的结点个数递归与非递归算法)
  10. CG行业如何学编程:献给想要学编程的CG孩