示例:

输入:

3
3 4 2
4 5 2
7 8 5

输出:5 7 31

题意:存在多少对<x,y>满足x&y>C或x^y<C的条件。(0<x<=A,0<y<=B)

题解:首先逆向考虑,求有多少对(x,y)满足x&y<=C且x^y>=C,然后用A*B去减它即可。然后就是数位dp模板题(数位dp不懂可先补一下知识再看这题),用dp[pos][ia][ib][iand][ixor]表示到第pos位的个数,ia位表示是否是A的上限,ib表示是否是B的上限,iand表示 与 的上限是否是C,ixor表示 异或 的下限是否是C,(当处理至某一位不为上下限时,即其上下限可随便取值,不懂将solve()中//printf("dp[%d][%d][%d][%d][%d]=%lld\n",pos,i,j,i&j,i^j,ans);的斜杠去掉,输入示例看过程)因为该dp表示的值与输入的A,B,C有关,所以每次都要memset置-1。因为dfs存在x或y为0的情况。而x、y最小是1,所以要减掉x或y为0的情况。x为0的个数有max(0,B-C+1),即y>=C;同理,y为0有max(0,A-C+1)种。

code:

#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL A,B,C,dp[][][][][];
int t,a[],b[],c[];
LL solve(int pos,int ia,int ib,int iand,int ixor)
{
if(pos<)return ;
if(dp[pos][ia][ib][iand][ixor]!=-)return dp[pos][ia][ib][iand][ixor];
int up1=,up2=,up3=,up4=;
if(ia)up1=a[pos];//如果ia/ib/iand/ixor为0,即此处无上下限约束
if(ib)up2=b[pos];
if(iand)up3=c[pos];
if(ixor)up4=c[pos];
LL ans=;
for(int i=;i<=up1;i++){
for(int j=;j<=up2;j++){
if((i&j)>up3)continue;
if((i^j)<up4)continue;
ans+=solve(pos-,ia&&(i==a[pos]),ib&&(j==b[pos]),iand&&((i&j)==c[pos]),ixor&&((i^j)==c[pos]));
//printf("dp[%d][%d][%d][%d][%d]=%lld\n",pos,i,j,i&j,i^j,ans);
}
}
return dp[pos][ia][ib][iand][ixor]=ans;
}
int main()
{
scanf("%d",&t);
while(t--){
memset(dp,-,sizeof(dp));
scanf("%lld%lld%lld",&A,&B,&C);
LL tA=A,tB=B,tC=C;
memset(a,,sizeof(a));memset(b,,sizeof(b));memset(c,,sizeof(c));
int i=,j=,k=;
while(tA||tB||tC){//处理A,B,C的二进制
if(tA){a[i++]=tA&;tA=tA>>;}
if(tB){b[j++]=tB&;tB=tB>>;}
if(tC){c[k++]=tC&;tC=tC>>;}
}
LL summ=solve(,,,,)-max(A-C+,0LL)-max(B-C+,0LL);
summ=(A*B)-summ;
printf("%lld\n",summ);
}
return ;
}

Pair(二进制处理+数位dp)(2019牛客暑期多校训练营(第七场))的更多相关文章

  1. 2019牛客暑期多校训练营(第一场) B Integration (数学)

    链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...

  2. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

  3. 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...

  4. [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem

    链接:https://ac.nowcoder.com/acm/contest/889/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...

  5. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  6. 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...

  7. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  8. Points Division(线段树+DP)2019牛客暑期多校训练营(第一场)

    题意:https://ac.nowcoder.com/acm/contest/881/I 给你n个平面上的点,每个点有a.b两个权值,现在让你划分成两个区域(要求所有A集合里的点不能在任何B集合里的点 ...

  9. DP+线段树维护矩阵(2019牛客暑期多校训练营(第二场))--MAZE

    题意:https://ac.nowcoder.com/acm/contest/882/E 给你01矩阵,有两种操作:1是把一个位置0变1.1变0,2是问你从第一行i开始,到最后一行j有几种走法.你只能 ...

  10. 2019牛客暑期多校训练营(第一场)I dp+线段树

    题意 给出n个点,每个点有a,b两个属性,让你从左下角到右上角划一条线,线的左边每个点的贡献是\(a_i\),线的右边每个点的贡献是\(b_i\),使得两部分的总和最大. 分析 找一条折线将点分割开, ...

随机推荐

  1. 使用for循环签到嵌套制作直角三角形

    注意代码的运行顺序: for(i = 0 ; i<9 ; i++){ for(j = 0 ; j<i-1 ; j++){ document.write("*")//** ...

  2. Linux运维相关命令

    df 查看磁盘空间大小 df命令是linux系统以磁盘分区为单位查看文件系统,可以加上参数查看磁盘剩余空间信息,命令格式: df -hl 显示格式为: 文件系统              容量 已用  ...

  3. Java基础教程(全代码解析)

    字面量: 整数字面量为整型(int) 小数字面量为双精度浮点型(double) 数据类型: byte short int long float double 接下来代码展示理解 public clas ...

  4. 海底高铁(洛谷 P3406)

    题目背景 大东亚海底隧道连接着厦门.新北.博艾.那霸.鹿儿岛等城市,横穿东海,耗资1000亿博艾元,历时15年,于公元2058年建成.凭借该隧道,从厦门可以乘坐火车直达台湾.博艾和日本,全程只需要4个 ...

  5. 初始CSS3小知识【99%人不知道的小技巧】

    一.引入样式    1.行内样式表   <h1 style="color: red;font-size: 18px;">10-30</h1>     2.内 ...

  6. office2010安装不了提示已经安装32位的了怎么办

    1.打开控制面板,查看是否有安装的程序没有拆卸,如果没有继续往下看,如果有直接拆卸掉,再进行下面的步骤. 2.首先打开注册列表.按下win+R键即可打开,输入regedit,也可以在开始菜单中搜索re ...

  7. 用Visual Studio编写UDF的一点小技巧(自动补全宏函数、变量)

    下载Visual Studio,安装VS 下载番茄助手(Visual Assist X),链接:www.wholetomato.com,然后安装番茄助手 打开VS

  8. es6学习1:let和const

    一:let   类似var 但是所声明的变量,只在let命令所在的代码块内有效. 1) 不存在变量提升 // var 的情况 console.log(foo); // 输出undefined var ...

  9. Confd+Consul 动态生成配置文件

    一.Consul安装和配置 1.consul是什么? consul是HashiCorp公司推出的一款工具,主要用于实现分布式系统的服务发现与配置,它提供了以下几个关键特性: 服务发现:Consul客户 ...

  10. [代码质量] 推荐一个vs自带工具分析代码的复杂度

    转载自: https://blog.csdn.net/zh_geo/article/details/52954145 VS2012 -> Analyze -> Calculate code ...