LG8468

题意

给定整数 \(s,m\),,判断能否构造一个长度为 \(n\)\(n\) 值自定)的数列 \(a\),满足:

  • \(1 \le n \le m\)
  • \(1 \le a_i \le s\)
  • \(S(a)\) 表示 \(a\) 中所有元素的异或和,则\(S(a)=0\)
  • \(a_1+a_2+\cdots+a_n=s\)

试构造任意一组合法解或报告无解。

分析

很容易发现 \(S(a)=0\) 可以作为突破口。

  • \(m=1\)

最多只有一个数,因此其本身异或和不可能为 \(0\),无解。

  • \(s \equiv 1 \pmod 2\)

\(s\) 为奇数时,很显然 \(a\) 序列里奇数的个数也一定是奇数(奇数 \(+\) 奇数 \(=\) 偶数,奇数 \(+\) 偶数 \(=\) 奇数),因此异或和不可能为 \(0\),无解。

  • 剩余的情况为有解

接下来考虑输出方案。既然 \(s\) 为偶数,那么可以把它分成相等的两部分,那么这两个数的异或和也为 \(0\)(因为它们相等),满足了条件,输出即可。

代码实现十分简单:

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int T,m;
	long long s;
	cin>>T;
	while(T--)
	{
		cin>>s>>m;
		if(s%2ll==0&&m>1) cout<<2<<' '<<s/2<<' '<<s/2;
		else cout<<-1;
		cout<<endl;
	}
}
posted @ 2024-01-20 17:41  liyilang2021  阅读(2)  评论(0编辑  收藏  举报