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

示例:
输入:
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牛客暑期多校训练营(第七场))的更多相关文章
- 2019牛客暑期多校训练营(第一场) B Integration (数学)
链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...
- 2019牛客暑期多校训练营(第二场)F.Partition problem
链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...
- 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...
- [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem
链接:https://ac.nowcoder.com/acm/contest/889/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)
题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9: 对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可. 后者mod=1e9,5才 ...
- 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...
- 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...
- Points Division(线段树+DP)2019牛客暑期多校训练营(第一场)
题意:https://ac.nowcoder.com/acm/contest/881/I 给你n个平面上的点,每个点有a.b两个权值,现在让你划分成两个区域(要求所有A集合里的点不能在任何B集合里的点 ...
- DP+线段树维护矩阵(2019牛客暑期多校训练营(第二场))--MAZE
题意:https://ac.nowcoder.com/acm/contest/882/E 给你01矩阵,有两种操作:1是把一个位置0变1.1变0,2是问你从第一行i开始,到最后一行j有几种走法.你只能 ...
- 2019牛客暑期多校训练营(第一场)I dp+线段树
题意 给出n个点,每个点有a,b两个属性,让你从左下角到右上角划一条线,线的左边每个点的贡献是\(a_i\),线的右边每个点的贡献是\(b_i\),使得两部分的总和最大. 分析 找一条折线将点分割开, ...
随机推荐
- HTML5 Geolocation(地理定位)
一.背景 在HTML规范中,增加了获取用户地理信息的API,这样使得可以基于用户位置开发互联网应用,即基于位置服务 鉴于该特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的. Inter ...
- 通过三层交换机实现不同VLAN间的通信
主机的IP地址以及子网掩码已列出,下面将讲解如何配置利用三层交换机来实现不同VLAN间的相互通信 SW1的命令: en //进入特权模式 conf t //全局模式 vlan 10 // ...
- 计蒜客——Reversion Count
Reversion Count 解析:题目数字的长度最大为 99,因此使用字符串处理,那么必然这些数存在某些规律.对于数 a (XYZW) 和数 b (WZYX),原式 = (1000X + 100Y ...
- C#程序发送POST请求数据中+号丢失解决方案
C#程序把RSA加密后的密码发送到后台总是校验失败,用wireshark抓包检查发现POST发出的密码中的+号都变成了空格.为了正确的发送数据,要用URL转码协议进行转码. 有两个方法进行URL转码 ...
- nRF51822 主从断开连接Reason,HCI ERROR CODE :0x003E
最近在给一个客户调主从一体的模块,基于S130,距离稍微远一点就会出现连接上后立马又断开连接的现象, 追踪了一下原因,给出的 HCI Error code 是 0x003E,暂且不知道这是什么鬼,查了 ...
- mysql 存储过程 REPEAT ... UNTIL ... END REPEAT
begin declare b int; declare use_no varchar(10); declare use_name varchar(400); decla ...
- go -- go 程序 启动docker容器
package main import ( "io" "log" "os" "time" "github.co ...
- 纯Python模式
http://crcmod.sourceforge.net/intro.html https://help.aliyun.com/document_detail/85288.html OSS的CRC数 ...
- vue elementUi tree 懒加载使用详情
背景:vue下使用elementUI 文档:http://element-cn.eleme.io/#/zh-CN/component/tree#tree-shu-xing-kong-jian 需求:只 ...
- PG11开启WAL归档
-创建归档目录 mkdir -p $PGDATA/archive_wals chown -R postgres.postgres $PGDATA/archive_wals -修改参数(在配置文件中配置 ...