不知大家有没有发现一个小细节,这道题所有的数字都和 2 有关。
直线上第 个格子所代表的米粒数在二进制下表示为一个(自右往左)第
位为1,其余位为0的一个二进制数。
考虑数 在二进制下的表达方式,其某一位为1则判断一个该位是否存在米粒。
#include<cstdio> #define LL long long const int MAXN=68; bool vis[MAXN]; int main() { int n,k; LL s; scanf("%d%d%lld",&n,&k,&s); for(int i=1;i<=k;i++) { int x; scanf("%d",&x);vis[x-1]=1; } bool flag=1; for(int b=0;s;s>>=1,b++) { if(s&1) { flag&=(!vis[b]); } } flag?printf("YES\n"):printf("NO\n"); return 0; }