考虑什么时候不满足条件。
明显当选到了需要使用没有买的饲料时,会引起。
于是只要统计买了的饲料、没用到的位的总和\(cnt\),这些位珂以随便分配,因为他们怎么取都会满足条件;其余位必须取\(0\)。
根据乘法原理,个数为\(2^{cnt}\)。再减去已经有的动物个数即可。注意开\(ull\)。
#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
int n,m,c,k;
unsigned long long mk=0;
int p[1000005];
bool unused[74];
signed main(){
//freopen("zoo3.in","r",stdin);
memset(unused,0,sizeof(unused));
cin>>n>>m>>c>>k;
for(int i=1;i<=n;i++){
int x;
cin>>x;
mk|=x;
}
for(int i=1;i<=m;i++){
int x;
cin>>p[i]>>x;
}
for(int i=1;i<=m;i++){
//cout<<(1<<p[i])<<endl;
if(!(mk&(1ull<<p[i])))unused[p[i]]=1;
}
int cnt=0;
for(int i=0;i<k;i++)if(unused[i])cnt++;
int cnt2=k-cnt;
if(cnt2==64&&!n)puts("18446744073709551616");
else{unsigned long long iee=(1ull/*重要*/<<cnt2);
cout<<iee-n<<endl;}
return 0;
}