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;
}
}
还是菜。