首先格子编号 从 1 ~ n 分别对应二进制位从低位到高位对应的值。对于第i个格子就是2^(i-1),所以对于s如果二进制某一位是 1 则说明要取这个格子的米粒,如果为0说明不取.

所以你这题只要判断下S二进制位中为1对应的格子 是否存在 且 非空,如果出现了一个格子是空的,或者没有这个格子,那么就是"NO"无法构造出这个方案,否则输出"YES"表示可以构成这个方案.

注意cin >> 要开usigned long long 不然就会有样例过不了(不知道为啥),scanf的话用long long 是可以的



#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int v[90];
int main(){
    //init();
    unsigned long long n,k,s;    cin >> n >> k >> s;
    for(int i = 1; i <= k; ++i){int x;    cin >> x; v[x] = 1;}
    int t = 0;//t + 1为第几个格子

    bool f = 1;
    while(s){
        if(s&1){
            if(v[t + 1]){f = 0 ;break;}

        }
       s >>= 1;
        ++t;
    }

    if(f && t <= n)    cout << "YES";
    else cout << "NO";
    return 0;
}