原题传送门
对于某一位,只要有已有的动物的这一位是1,或是要求中没有提及这一位,都有2种情况
设有
m
m
m位这样的位,答案就是
2
m
−
n
2^m-n
2m−n
可以直接用二进制的位运算解决问题,但是因为数据范围是
2
64
2^{64}
264,所以要爆ll
我考场上不敢用ull,所以写了高精,但是T了
然后ull的话也要注意 m = 0 , k = 64 m=0,k=64 m=0,k=64的情况,特判一下
Code:
#include <bits/stdc++.h>
#define maxn 110
#define ull unsigned long long
using namespace std;
ull n, m, c, k;
inline ull read(){
ull s = 0, w = 1;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
for (; isdigit(c); c= getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
return s * w;
}
int main(){
n = read(), m = read(), c = read(), k = read();
if (k == 64 && m == 0) return puts("18446744073709551616"), 0;
ull x = 0, y = 0;
for (int i = 1; i <= n; ++i) x |= read();
for (int i = 1; i <= m; ++i) y |= 1ull << read(), read();
ull ans = k;
for (int i = 0; i < k; ++i) ans -= (((y >> i) & 1) > 0 && ((x >> i) & 1) == 0);
if (ans == 0) puts("0");
else cout << (1ull << ans) - n;
return 0;
}