A.题意:输入n和k,下一行是n个数 ,问n个数的mex刚好是k需要添加/删除多少个数字
思路:遍历一次找小于k个数num1和等于k的个数num2 .ans=k-num1+num2
C题意: 输入n和k 问是否存在n个数使得n个数的异或和=k 若存在,输出YES和其中一个解,k<10000;
思路:x=a[n-1]^a[n-2].....a[1]^a[0]等价于a[n-1]=x^a[0]^a[1]^a[2]^a[3].... ,
所以就可以构造出a[0]=0,a[1]=1...a[n-2]=n-2;
为了让a[n-1]与a[0]~a[n-2]各不相等,让a[0]^(1<<17),a[1]^(1<<18)即可
int main()
{
int a[100005];
int ans=0;
int n=3;
int x;
cin>>n>>x;
if(n==2&&x==0)
{
printf("NO\n");
return 0;
}
printf("YES\n");
if(n==1)
{
printf("%d\n",x);
return 0;
}
for(int i=0; i<n-1; i++)
{
a[i]=i;
}
a[0]^=(1<<17);
a[1]^=(1<<18);
int t=0;
for(int i=0; i<n-1; i++)
{
t^=a[i];
}
a[n-1]=t^x;
for(int i=0; i<n; i++)
{
printf("%d ",a[i]);
}
printf("\n");
for(int i=0; i<=n-1; i++)
{
ans^=a[i];
}
//printf("%d\n",ans);
return 0;
}