Codeforces Round #554 (Div. 2)·
A. Neko Finds Grapes
A就是钥匙和锁上的数字的和为奇数就行。
odd+even=odd
odd+odd=even
even+even=even
所以只要保证奇数和偶数加就行,就是用奇数的锁去配对偶数的钥匙,偶数的锁去配对奇数的钥匙
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAXN=1e5+10;
LL a[MAXN];
LL b[MAXN];
int main()
{
	LL n,m;
	LL ao=0,ae=0,bo=0,be=0;
	LL sum=0;
	
	scanf("%lld %lld",&n,&m); 
	for(LL i=0;i<n;i++){
		scanf("%lld",&a[i]);
		if(a[i]%2==0){
			ae++;
		}else{
			ao++;
		}
	}
	for(LL i=0;i<m;i++){
		scanf("%lld",&b[i]);
		if(b[i]%2==0){
			be++;
		}else{
			bo++;
		}
	}
	sum=min(ae,bo)+min(ao,be);
	printf("%lld",sum);
	
	return 0;
}
B. Neko Performs Cat Furrier Transform
你需要知道:n^0=n,异或时,相同的那一位为0,不相同的那一位为1
题目要求最后要全部为2^m-1的形式,就是二进制的每一位都为1
以第一个样例
39的二进制是 100111,个人思路是先把前面的非0位异或为0,酱紫就不会受后面影响啦,所以当前的n就是为0的最大位数,当前为5;
39⊕(2^5-1)为  111000 为 56
偶数次操作时+1
111000 --> 111001  57
然后再选择n=3
57⊕(2^3-1)为   111110 为 62
62+1=63  111110–>111111  2^6-1

# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n[40];
LL l[40];
int lenn(LL xx)
{
	int flag=0;
	int len=0;
	while(xx){
		int d=xx%2;
		if(d){
			if(flag) break;
			len++;
		}else{
			flag=1;
			len++;
		}
		xx=xx/2;
	}
	return len;
}
int main()
{
	LL x;
	LL t=1;
	
	scanf("%lld",&x);
	LL xx=x;
	LL ans=0;
	int fflag=1;
	while(xx){
		int d=xx%2;
		if(d==0){
			fflag=0;
		}
		xx=xx/2;
		ans++;
	}
	if(fflag){
		printf("0");
		return 0; 
	}
	ans=pow(2,ans)-1;
	//cout<<ans<<endl;
	for(int i=0;i<=30;i++){
		n[i]=pow(2,i)-1;
	}
	
	LL llen=0;
	while(t<=40){
		if(t%2==0){
			x++;
		}else{
			llen=lenn(x);
			x=x^(n[llen]);
			l[t]=llen;
		}
		if(x==ans){
			printf("%d\n",t); 
			for(int i=1;i<=t;i++){
				if(i%2==0) continue;
				else{
					printf("%d ",l 
                    
                     
                    
                