一种动物不会影响饲料清单,当且仅当每一位要么为00,要么没有饲料要求,要么已存在的动物中有这一位为11的
由于q_iqi互不相同,那么只有已存在的动物中有第ii位为11的,清单上才有第ii位所需的饲料
可以用unsigned long long
存储这些状态,详见代码
O(n+m)O(n+m)
#include<cstdio>
typedef unsigned long long ull;//存储范围[0,2^64)
int n,m,k;
ull s=1,a,b,x;//a的第i位表示是否有第i位为1的动物,b的第i位表示第i位是否需要饲料
int main(){
scanf("%d%d%*d%d",&n,&m,&k);//%*d表示读入一个数,但不存储
for(int i=1;i<=n;++i){
scanf("%llu",&x);//%llu表示unsigned long long类型
a|=x;
}
for(int x,i=1;i<=m;++i){
scanf("%d%*d",&x);
b|=1ULL<<x;//第x位需要饲料
}
a|=~b;//若某一位有动物,或该位无需饲料,则该位可以任取
for(int i=0;i<k;++i)s<<=a>>i&1;//若该位可以任取,ans*=2
if(!s&&!n)printf("18446744073709551616");
//特殊情况:64位均能任取,且初始没有动物,答案为2^64,超出ull存储范围
else printf("%llu",s-n);//由于自然溢出,答案是正确的
}
啦啦啦啦啦啦啦啦啦啦啦