A.牛牛吃米粒

把每个格子看成一个二进制位,n个格子就构成一个二进制数。而每个二进制数唯一对应一个十进制数。因此n个格子能构成s对应的二进制数时答案为"YES",否则为"NO。
经过两步判断可求得答案:

  1. s否超出2^n,则一定为"NO"
  2. s对应的二进制为上1的位置若出问题,则一定为"NO"

首先进行第一步判断s的最大值为2^64,位运算时有些细节:

  1. 当n=64时,数据范围内的所有s都能被表示。
  2. 当n<64时,需要用位运算判断s是否超过2^n。
#include <iostream>
#include <cstring>

#define x first
#define y second

using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;

const int N = 70;

int n, k, a[N];
ULL s;

int main() {
    cin >> n >> k >> s;

    bool flag = 1;
    ULL tem = 1;
    if (n <= 63 && (tem << n) <= s)//判断s是否超过n位二进制的最大表示范围
        flag = 0;    

    for (int i = 1; i <= k; i ++) {
        int x;
        cin >> x;
        if (s >> (x - 1) & 1) flag = 0;//判断第x(从1开始)位二进制是否为1
    }
    if (flag)   cout << "YES";
    else cout << "NO";
    return 0;
}