不知大家有没有发现一个小细节,这道题所有的数字都和 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;
} 
京公网安备 11010502036488号