csp 2020 s-2

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
ull cnt,ans,n,m,c,k,sum;
int a[70];/*!ull*/
typedef long long ll;

int main() {
//    cin>>n>>m>>c>>k;
    scanf("%llu%llu%llu%llu",&n,&m,&c,&k);
    if(n==0&&m==0&&k==64) {
        printf("18446744073709551616");
        return 0;
    }
    for(int i=1; i<=n; i++) {
        ull x;
//        cin>>x;
        scanf("%llu",&x);
        cnt=cnt|x;//制作饲料清单
    }

    for(int i=1; i<=m; i++) {
//        cout<<m<<endl;
        int x,y;
        scanf("%d%d",&x,&y);
//        cin>>x>>y;
        a[x]=y;//标记当前位数有要求
    }

    for(int i=0; i<64; i++) {
        if((cnt&(1ll<<i))/*!()*/&&a[i])//表示当前位数满足条件
            a[i]=0;
    }

    for(int i=0; i<64; i++) {
        if(a[i]) sum++;//找有多少不满足要求的
    }

    /*ans=1ll<<k;
    ans-=n;
    ans-=(1ll<<(k-sum))*((1ll<<sum)-1);
    //    cout<<ans<<endl;
    //这样写会爆 ull*/ 
    
    ans=1ll<<(k-1);
    ans-=n;
    ans+=(1ll<<(k-1));
    ans-=((1ll<<sum)-1)*(1ll<<(k-sum));
    //类似位运算的题目尽量考虑大小问题 
    
    printf("%llu",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/yxr001002/p/13964902.html