80分求助
查看原帖
80分求助
173056
_Veritas楼主2020/11/8 15:33

RT

算法是把a[i]按位或起来 用bool数组记录每一位有没有对应饲料

最后把两个数组或起来

统计1的个数cnt

ans=2cntnans=2^{cnt}-n

#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 1000006
#define MAXM 1000006
#define MAXK 100
using namespace std;
int n,m,c,k;
unsigned long long A,a;
int p,q;
bool book[MAXK];
int readint(){
	int x=0;char c;
	c=getchar();
	while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x;
}
unsigned long long readull(){
	unsigned long long x=0;char c;
	c=getchar();
	while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x;
}

int main(){
	//freopen("zoo.in","r",stdin);
	//freopen("zoo.out","w",stdout);
	n=readint(),m=readint(),c=readint(),k=readint();
	A=1;
	for(int i=1;i<=n;++i){
		a=readull();
		A=A|a;
	}
	memset(book,1,sizeof(book));
	for(int i=1;i<=m;++i){
		p=readint(),q=readint();
		book[p]=0;
	}
	unsigned long long cnt=0,ans=0;
	for(int i=0;i<k;++i)
		if( book[i]|| (A&(1ull<<i)) )
			++cnt;
	ans=(1ull<<cnt);
	ans-=n;
	cout<<ans;
	fclose(stdin);fclose(stdout);
	return 0;
}
2020/11/8 15:33
加载中...