[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 ...
随机推荐
- Spark-Core RDD转换算子-双Value型交互
1.union(otherDataSet) 作用:求并集. 对源 RDD 和参数 RDD 求并集后返回一个新的 RDD scala> val rdd1 = sc.parallelize(1 to ...
- KMP字符串匹配 模板 洛谷 P3375
KMP字符串匹配 模板 洛谷 P3375 题意 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.(如果 ...
- docker elk
1.核心组成 ELK由Elasticsearch.Logstash和Kibana三部分组件组成: Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片, ...
- WordPress用户的权限类
WordPress的权限类这是管理 WordPress 用户权限最常用的函数.WordPress 用于角色和权限幕后工作的三个类,以及这些类提供的接口,我们可以在插件中进行高级权限管理.这三个类是: ...
- 简单的物流项目实战,WPF的MVVM设计模式(一)
新建一个WPF项目,命名为WMS 然后分别新建文件夹,Data,Models,Views,ViewModels,Services,如下图所示 然后通过NuGet安装连个Nuget包,分别为SQLite ...
- vue + nginx部署404
记录: vue项目打包放到服务器,使用nginx反向代理的时候路由页面刷新报404,因为刷新时,不存在路径对应的文件或文件夹,需要在nginx配置中添加代码: index index.html; tr ...
- 将Docker主机数据挂在到容器中
dcoker 提供三种不同的方式将数据从宿主机挂载到容器中:volumes,bind mounts, tmpfs.volumes: Docker管理宿主机文件系统的一部分(/var/lib/docke ...
- 【原】cmdline传递参数 uboot-->kernel-->fs
在uboot中设置bootargs环境变量,在kernel启动后cat /proc/cmdline可以看到bootargs的值. U-boot的环境变量值得注意的有两个: bootcmd 和boota ...
- css3-background clip 和background origin
1.background-origin background-origin 里面有3个参数 : border-box | padding-box | content-box; border-box,p ...
- DOM-document 对象
Document 对象Document 对象代表整个HTML 文档,可用来访问页面中的所有元素.Document 对象是 Window 对象的一个部分,可通过 window.document 属性来访 ...