[CSP-S模拟测试]:位运算(数学)
题目传送门(内部题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模拟测试]:位运算(数学)的更多相关文章
- 【模拟+递归+位运算】POJ1753-Flip Game
由于数据规模不大,利用爆搜即可.第一次用位运算写的,但是转念一想应该用递归更加快,因为位运算没有剪枝啊(qДq ) [思路] 位运算:时间效率较低(172MS),有些辜负了位运算的初衷.首先将二维数组 ...
- SPOJ:OR(位运算&数学期望)
Given an array of N integers A1, A2, A3…AN. If you randomly choose two indexes i ,j such that 1 ≤ i ...
- HDU - 4810 - Wall Painting (位运算 + 数学)
题意: 从给出的颜料中选出天数个,第一天选一个,第二天选二个... 例如:第二天从4个中选出两个,把这两个进行异或运算(xor)计入结果 对于每一天输出所有异或的和 $\sum_{i=1}^nC_{n ...
- [CSP-S模拟测试]:Walker(数学)
题目传送门(内部题86) 输入格式 第一行$n$接下来$n$行,每行四个浮点数,分别表示变换前的坐标和变换后的坐标 输出格式 第一行浮点数$\theta$以弧度制表示第二行浮点数$scale$第三行两 ...
- [CSP-S模拟测试]:Six(数学)
题目传送门(内部题85) 输入格式 一个正整数$N$. 输出格式 一个数表示答案对$1000000007$取模后的结果 样例 样例输入1: 样例输出1: 样例输入2: 样例输出2: 样例输入3: 样例 ...
- [CSP-S模拟测试]:数字(数学+高精度)
题目描述 很简单,给出正整数$n$,求出$n!$在十进制表示下的从最末非零位开始的总共$k$位. 输入格式 第一行一个正整数$T$,表示有$T$组数据接下来$T$行,每行两个正整数$n$和$k$. 输 ...
- [CSP-S模拟测试]:不等式(数学)
题目描述 小$z$热衷于数学.今天数学课的内容是解不等式:$L\leqslant S\times x\leqslant R$.小$z$心想这也太简单了,不禁陷入了深深的思考:假如已知$L,R,S,M$ ...
- [CSP-S模拟测试]:antipalindrome(数学)
题目传送门(内部题58) 输入格式 第一行一个数$T$表示数据组数.接下来每行两个数$n$和$m$. 输出格式 $T$行,每行一个答案,对${10}^9+7$取模. 样例 样例输入: 25 66 5 ...
- [CSP-S模拟测试]:Race(数学+Trie树)
题目描述 一年一度的运动会开始了.有$N$个选手参赛,第$i$个选手有一个能力值(保证$A[i]$两两不同),比赛一共进行了天.在第$j$天($0\leqslant j\leqslant 2^{m-1 ...
随机推荐
- 第六周总结&第四次实验报告
实验四 类的继承 一. 实验目的 (1) 掌握类的继承方法: (2) 变量的继承和覆盖,方法的继承.重载和覆盖实现: 二. 实验内容 三.实验过程 实验代码 package Shiyan4; publ ...
- W3C标准定义的DOM由哪三部分组成
DOM 定义了访问诸如 XML 和 XHTML 文档的标准.“W3C 文档对象模型(DOM)是一个使程序和脚本有能力动态地访问和更新文档的内容.结构以及样式的平台和语言中立的接口.”DOM 定义了所有 ...
- JS基础篇--JS获取元素的宽高以及offsetTop,offsetLeft等的属性值
$(obj).width()与$(obj).height() $(obj).width()与$(obj).height() :jquery方式获取元素的宽高,不包括滚动条与工具条 $(obj).wid ...
- 题解 CF1119A 【Ilya and a Colorful Walk】
此题就是:给你一个数组,让你找出两个不同的元素,并让它们的下标差距最大. 思路:从2到n,如果与1不同,记录距离,与原数比较,取大. 从1到n-1,如果与n不同,记录距离,与原数比较,取大. AC代码 ...
- JDK集合框架源码分析 - 简单概要
1.类继承体系 在集合框架的类继承体系中,最顶层有两个接口Collection.Map: Collection 表示一组纯数据 Map 表示一组key-value对 Collection的类继承体系: ...
- Excel批量插入的SQL Server
首先新建一个WPF的项目,名为ExcelToServerDemo 到Nuget去安装NPOI的Nuget包,点击安装即可,会自动引用项目. 新建一个Student的表格,有名字,年龄,性别,地址,以及 ...
- 简单的物流项目实战,WPF的MVVM设计模式(五)
开始界面 <Grid> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> <RowD ...
- JS解析URL参数为对象
曲不离口,拳不离手 JS小编程练习之一:解析URL参数为对象 url:http://www.baidu.com/we/index.html?id=098&aaa=123&ccc=456 ...
- Spring基础18——通过注解配置bean之间的关联关系
1.组件装配 <context:component-scan>元素还会自动注册AutowiredAnnotaionBeanPostProcessor实例,这是一个bean的后置处理器,该实 ...
- 关于jsp 获得当前绝对路径的方法
方法1) request.getRequestURL(); 方法2) request.getScheme()+"://"+request.getServerName()+&quo ...