2022河南省赛 F 构造

该博客探讨了如何构造集合A,使得A+A的元素个数等于给定的奇数n,并分析了集合元素的奇偶性构造。通过等差数列和数列差值的不同组合,得出不同情况下的集合大小和元素范围。对于偶数n的情况,提出了通过调整数列首项来改变和的奇偶性的方法。博客还特别指出n=2和n=4时无解,并给出了C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

定义集合运算S=A+B={x+y∣x∈A,y∈B}S=A+B=\{x+y|x\in A,y\in B\}S=A+B={x+yxA,yB}∣S∣|S|S为集合SSS的大小,构造一个集合AAA,使得∣A+A∣=n|A+A|=nA+A=n,并且使x∈Ax\in AxAx∈[0,5×105]x\in[0,5\times 10^5]x[0,5×105]

Solution:

没有想法就打表,首先打表简单的数列[1,2,3,.....][1,2,3,.....][1,2,3,.....],若数列长度为mmm,那么∣A+A∣=2m−1|A+A|=2m-1A+A=2m1,恰好这包含了所有奇数的情况。

接着考虑,是不是所有数列都是这样呢,好像并不是,等差数列存在很多对树相加相等,这是算少了,我们造一个两两差值不同的,再来考虑,比如[1,3,6,10,15][1,3,6,10,15][1,3,6,10,15],这样的情况是15,即每一对都是一种情况,于是,给出长mmm的数列,他们的和的种类应该是∈[2m−1,Cm2=m(m+1)2]\in[2m-1,C_{m}^{2}=\frac{m(m+1)}{2}][2m1,Cm2=2m(m+1)]的。同时我们考虑偶数怎么构造,如果我们能做到减1,那么就完成了奇偶交换,再来考虑这个等差数列的例子[1,2,3,....,m][1,2,3,....,m][1,2,3,....,m],他们的和的种类即[2,3,.....,2m][2,3,.....,2m][2,3,.....,2m],最值只能被一种情况表示!即2=1+12=1+12=1+12m=m+m2m=m+m2m=m+m,没有其他情况了,于是我们考虑增加或删去一个最值,把1换成0,那么和的情况为[0,2,3,4,...,2m][0,2,3,4,...,2m][0,2,3,4,...,2m],刚好增加一种,这是偶数的构造方法

然后还有n=2,4n=2,4n=2,4的情况是无解的。。上面那个种数的范围,带入n=2,4n=2,4n=2,4,解不等式是无解的

#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<set>
#include<queue>
#include<cmath>
#include<cstring>
#include<ctime>
#define endl '\n'
using namespace std;

using ll=long long;
const int N=1000005,inf=0x3fffffff;
const long long INF=0x3f3f3f3f3f3f,mod=998244353;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	int n; cin>>n;
	if(n==2||n==4)
	{
		cout<<-1;
		return 0;
	}
	if(n&1)
	{
		cout<<(n+1)/2<<endl;
		for(int i=1;i<=(n+1)/2;i++) cout<<i<<" ";
	}	
	else
	{
		cout<<n/2<<endl;
		cout<<0<<" ";
		for(int i=2;i<=n/2;i++) cout<<i<<" ";
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值