动物园
动物园
这道题的背景有些牵强,其实 \(q_i\) 完全没有用。
首先,如果《饲养指南》中提到的规则在动物园已有的动物中存在,那么这种饲料一定会购买,那么就可以养 \(p_i\) 位为 \(0/1\) 都可以。但是如果动物园已有的动物中不存在,那么如果新动物 \(p_i=1\) 必定是要买新的饲料,那么不符合题意。综上,发现所有可以供养的动物就是所有 \(p_i\) 可能的乘积。注意 \(2^{64}\) 特判,以及两条规则 \(p_i\) 相等等价的判断。
#include<cstdio>
using namespace std;
#define Ls(i,l,r) for(int i=l;i<r;++i)
#define Rs(i,l,r) for(int i=r;i>l;--i)
#define L(i,l) for(int i=0;i<l;++i)
int n,m,c,k;
typedef unsigned long long ll;
bool st[70];
ll ans=1;
int main(){
scanf("%d%d%d%d",&n,&m,&c,&k);
ll r=0;
L(i, n){
ll x;
scanf("%llu",&x);
r|=x;
}
L(i, m){
int p,q;
scanf("%d%d",&p,&q);
if(!(r>>p&1)&&!st[p])st[p]=1,k--;
}
if(k==64){
if(!n)puts("18446744073709551616");
else printf("%llu",-n);
}
else printf("%llu",(1ull<<k)-n);
return 0;
}