题目传送门(内部题72)


输入格式

  输入文件$bit.in$
  每个输入文件包含$T$组测试数据。输入文件的第一行为一个整数$T$,表示数据组数。接下来$T$行,每行表示一组测试数据每组测试数据包括三个空格隔开的数字 $ResultAnd,ResultOr,ResultXor$,依次表示对$a\&b,a|b,a\text{^}b$的限制。
  如果三项中某一项的数字为$-1$,那么说明对这一项没有限制。否则这一项的数字一定是一个非负整数,表示$a$和$b$进行这种运算后的结果。


输出格式

  输入文件$bit.out$
  $T$行,每行一个整数或一个字符串$"inf"$(不输出引号)。
  第$i$行的整数或字符串表示第$i$组测试数据的答案。


样例

样例输入:

10
20 1015 995
921 661 -1
-1 375 -1
30445634 30446311 30446245
11997588 11998143 555
-1 65535 -1
-1 465530605 312684161
2118209 930739953 928621744
69739040 402620388 332881348
4594346 533159678 528565332

样例输出:

128
0
2187
0
32
43046721
4096
32768
131072
4096


数据范围与提示

样例解释:

样例中$T=10$,且样例的第$i$行是来自第$(2*i-1)$个测试点的一组输入数据

数据范围:

对全部测试点:$T\leqslant 10,ResultAnd,ResultOr,ResultXor$都是$[-1,10^9]$区间内的整数。对同一组数据,$ResultAnd,ResultOr,ResultXor$不会均为$-1$。
第$1$到$5$个测试点:$0\leqslant ResultOr \leqslant 1023$
第$6$到$10$个测试点:$ResultOr-ResultAnd\leqslant 1000,ResultOr>=0,ResultAnd>=0$
第$11$到$16$个测试点:答案中不会出现$inf$
第$11$和$12$个测试点还满足:$ResultAnd=ResultXor=-1$
第$17,18$个测试点满足:不等于$inf$的答案不会超过$int$数据类型能表示的范围
第$19,20$个测试点:无特殊限制


题解

大力分类讨论即可。

位运算一定要先将其每位提取处理。

不妨设$a[i],b[i].c[i]$分别表示$\&,|,\text{^}$的每一位。

依次枚举:

  $\alpha.$都有限制:$ans=2^{\sum \limits_{i=1}^{30}a[i]\text{^}b[i]}$。

  $\beta.\&$没有限制:$ans=2^{\sum \limits_{i=1}^{30}b[i]\&c[i]}$。

  $\gamma.|$没有限制:$ans=2^{\sum \limits_{i=1}^{30}c[i]}$。

  $\delta.\text{^}$没有限制:$ans=2^{\sum \limits_{i=1}^{30}a[i]\text{^}b[i]}$。

  $\epsilon.$只有$\&$有限制:$ans=inf$。

  $\zeta.$只有$|$有限制:$ans=3^{\sum \limits_{i=1}^{30}b[i]}$。

  $eta.$只有$\text{^}$有限制:$ans=inf$。

时间复杂度:$\Theta(30\times T)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int AND,OR,XOR;
int a[50],b[50],c[50];
long long qpow(long long x,long long y)
{
long long res=1;
while(y)
{
if(y&1)res=res*x;
x=x*x;
y>>=1;
}
return res;
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
int sum=0;
scanf("%d%d%d",&AND,&OR,&XOR);
if(AND!=-1&&OR==-1&&XOR==-1){puts("inf");continue;}
if(AND==-1&&OR==-1&&XOR!=-1){puts("inf");continue;}
if(AND!=-1&&OR!=-1&&XOR!=-1)
{
for(int i=0;i<=30;i++)
{
a[i]=(AND>>i)&1;
b[i]=(OR>>i)&1;
c[i]=(XOR>>i)&1;
if(a[i]&&!b[i]){puts("0");goto nxt;}
if(a[i]&&c[i]){puts("0");goto nxt;}
if(!b[i]&&c[i]){puts("0");goto nxt;}
sum+=a[i]^b[i];
}
printf("%lld\n",qpow(2,sum));
}
if(AND!=-1&&OR==-1&&XOR!=-1)
{
for(int i=0;i<=30;i++)
{
a[i]=(AND>>i)&1;
c[i]=(XOR>>i)&1;
if(a[i]&&c[i]){puts("0");goto nxt;}
sum+=c[i];
}
printf("%lld\n",qpow(2,sum));
}
if(AND==-1&&OR!=-1&&XOR!=-1)
{
for(int i=0;i<=30;i++)
{
b[i]=(OR>>i)&1;
c[i]=(XOR>>i)&1;
if(!b[i]&&c[i]){puts("0");goto nxt;}
sum+=b[i]&c[i];
}
printf("%lld\n",qpow(2,sum));
}
if(AND!=-1&&OR!=-1&&XOR==-1)
{
for(int i=0;i<=30;i++)
{
a[i]=(AND>>i)&1;
b[i]=(OR>>i)&1;
sum+=a[i]^b[i];
if(a[i]&&!b[i]){puts("0");goto nxt;}
}
printf("%lld\n",qpow(2,sum));
}
if(AND==-1&&OR!=-1&&XOR==-1)
{
for(int i=0;i<=30;i++)
sum+=(OR>>i)&1;
printf("%lld\n",qpow(3,sum));
}
nxt:;
}
return 0;
}

rp++

[CSP-S模拟测试]:位运算(数学)的更多相关文章

  1. 【模拟+递归+位运算】POJ1753-Flip Game

    由于数据规模不大,利用爆搜即可.第一次用位运算写的,但是转念一想应该用递归更加快,因为位运算没有剪枝啊(qДq ) [思路] 位运算:时间效率较低(172MS),有些辜负了位运算的初衷.首先将二维数组 ...

  2. SPOJ:OR(位运算&数学期望)

    Given an array of N integers A1, A2, A3…AN. If you randomly choose two indexes i ,j such that 1 ≤ i ...

  3. HDU - 4810 - Wall Painting (位运算 + 数学)

    题意: 从给出的颜料中选出天数个,第一天选一个,第二天选二个... 例如:第二天从4个中选出两个,把这两个进行异或运算(xor)计入结果 对于每一天输出所有异或的和 $\sum_{i=1}^nC_{n ...

  4. [CSP-S模拟测试]:Walker(数学)

    题目传送门(内部题86) 输入格式 第一行$n$接下来$n$行,每行四个浮点数,分别表示变换前的坐标和变换后的坐标 输出格式 第一行浮点数$\theta$以弧度制表示第二行浮点数$scale$第三行两 ...

  5. [CSP-S模拟测试]:Six(数学)

    题目传送门(内部题85) 输入格式 一个正整数$N$. 输出格式 一个数表示答案对$1000000007$取模后的结果 样例 样例输入1: 样例输出1: 样例输入2: 样例输出2: 样例输入3: 样例 ...

  6. [CSP-S模拟测试]:数字(数学+高精度)

    题目描述 很简单,给出正整数$n$,求出$n!$在十进制表示下的从最末非零位开始的总共$k$位. 输入格式 第一行一个正整数$T$,表示有$T$组数据接下来$T$行,每行两个正整数$n$和$k$. 输 ...

  7. [CSP-S模拟测试]:不等式(数学)

    题目描述 小$z$热衷于数学.今天数学课的内容是解不等式:$L\leqslant S\times x\leqslant R$.小$z$心想这也太简单了,不禁陷入了深深的思考:假如已知$L,R,S,M$ ...

  8. [CSP-S模拟测试]:antipalindrome(数学)

    题目传送门(内部题58) 输入格式 第一行一个数$T$表示数据组数.接下来每行两个数$n$和$m$. 输出格式 $T$行,每行一个答案,对${10}^9+7$取模. 样例 样例输入: 25 66 5 ...

  9. [CSP-S模拟测试]:Race(数学+Trie树)

    题目描述 一年一度的运动会开始了.有$N$个选手参赛,第$i$个选手有一个能力值(保证$A[i]$两两不同),比赛一共进行了天.在第$j$天($0\leqslant j\leqslant 2^{m-1 ...

随机推荐

  1. 分享一个linux中测试网站是否正常的shell脚本

    #! /bin/bash #Author=Harry CheckUrl() { #<==定义函数,名字为CheckUrl timeout=5 #<==定义wget访问的超时时间,超时就退出 ...

  2. HDU 1043 Eight 八数码问题 A*算法(经典问题)

    HDU 1043 Eight 八数码问题(经典问题) 题意 经典问题,就不再进行解释了. 这里主要是给你一个状态,然后要你求其到达\(1,2,3,4,5,6,7,8,x\)的转移路径. 解题思路 这里 ...

  3. H264 RTP包解析

    1.  预备 视频: 由一副副连续的图像构成,由于数据量比较大,因此为了节省带宽以及存储,就需要进行必要的压缩与解压缩,也就是编解码. h264裸码流: 对一个图像或者一个视频序列进行压缩,即产生码流 ...

  4. centos7 安装redis 出现cc: command not found错误解决

    安装过程 1. 下载并解压 cd /root/software wget http://download.redis.io/releases/redis-3.2.4.tar.gz tar -zxvf ...

  5. [LeetCode] 108. 将有序数组转换为二叉搜索树

    题目链接 : https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/ 题目描述: 将一个按照升序排列的 ...

  6. 在JSP中<%= >,<%! %>,<% %>所代表的含义

    <%! %>:是jsp中的声明标签,通常声明全局变量,常量,方法等. <% %>:<% java代码 %>,其中可以包含局部变量,java语句等. <%= % ...

  7. Vue实现二级菜单的显示与隐藏

    <html> <head> <title>Vue实现二级菜单的显示与隐藏</title> <script src="vue.js&quo ...

  8. Apache 安装后启动出现的错误

    错误信息 1: configure: error: APR not found 解决方法:yum install apr* -y 错误信息 2:httpd: apr_sockaddr_info_get ...

  9. PAT Basic 1036 跟奥巴马一起编程 (15 分)

    美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014 年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个 ...

  10. grep 文本过滤

    1.命令功能 grep, egrep, fgrep - print lines matching a pattern 根据匹配模式空间(正则表达式)打印结果行. 2.语法格式 grep   [opti ...