题目传送门(内部题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. eclipse maven 项目突然所有的JS方法都失效了

    原因:JS 或者 jQuery 有严重的语法错误

  2. linux中防止黑客进入单用户模式进行强制修改密码窃取数据

    如何防止别人恶意通过单用户系统破解root密码,进入系统窃取数据? 给grub加密,不让别人通过grub进入单用户. 当前系统:CentOS Linux release 7.6.1810 (Core) ...

  3. Docker网络大揭秘(单机)

    docker网络官网 https://docs.docker.com/network/ Docker容器和服务如此强大的原因之一是您可以将它们连接在一起,或将它们连接到非Docker工作负载.Dock ...

  4. 动态规划: HDU1003Max Sum

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  5. php配置伪静态如何将.htaccess文件转换 nginx伪静态文件

    php通常设置伪静态三种情况,.htaccess文件,nginx伪静态文件,Web.Config文件得形式,如何将三种伪静态应用到项目中呢, 1,.htaccess文件 实例 <IfModule ...

  6. 解决arcgis10.5直连postgresql报错

    软件版本: arcgis10.5 postgresql9.5.9 最近使用desktop直连postgresql,已经拷贝了类库文件到desktop及pgsql配置完成的前提下,但还是报以下错误: 解 ...

  7. HTML面试问题收集(1)

    1.浏览器页面有哪三层构成,分别是什么,作用是什么? 构成:结构层.表示层.行为层分别是:HTML.CSS.JavaScript 作用:HTML实现页面结构,CSS完成页面的表现与风格,JavaScr ...

  8. 浅析DES、AES、RSA、MD5加密算法及其应用场景

    对称加密算法DES 算法:一种典型的块加密方法,将固定长度的明文通过一系列复杂的操作变成同样长度的密文,块的长度为64位.同时,DES 使用的密钥来自定义变换过程,因此算法认为只有持有加密所用的密钥的 ...

  9. [七月挑选]windows上面的发音

    title: windows上面的发音 开始 love.vbs: CreateObject("SAPI.SpVoice").Speak "I love YOU" ...

  10. 长沙理工大学第十二届ACM大赛L 选择困难症 (剪枝暴搜)

    链接:https://ac.nowcoder.com/acm/contest/1/L 来源:牛客网 选择困难症 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 131072K,其他语言 ...