动物园

发布时间 2023-05-25 15:37:37作者: wscqwq

动物园

这道题的背景有些牵强,其实 \(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;
}