题意:
定义集合运算S=A+B={x+y∣x∈A,y∈B}S=A+B=\{x+y|x\in A,y\in B\}S=A+B={x+y∣x∈A,y∈B},∣S∣|S|∣S∣为集合SSS的大小,构造一个集合AAA,使得∣A+A∣=n|A+A|=n∣A+A∣=n,并且使x∈Ax\in Ax∈A有x∈[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-1∣A+A∣=2m−1,恰好这包含了所有奇数的情况。
接着考虑,是不是所有数列都是这样呢,好像并不是,等差数列存在很多对树相加相等,这是算少了,我们造一个两两差值不同的,再来考虑,比如[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}]∈[2m−1,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+1,2m=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;
}