锻炼脑子的小构造题。。。
一开始被 a[]<=30000 且 序列 gcd = 1所困扰,但是发现这并没有什么,因为我接下来发现了一种总是能构造出 序列和是6的倍数的方案。
首先如果 n==3 的话输出样例,因为只有这种情况没法用我的方法构造。
否则,考虑两个集合,第一个集合 A 代表<=30000的所有偶数,显然 |A| = 15000;
第二个集合 B 代表 <=30000的所有非偶数的3的倍数,显然 |B| = 5000。
神奇的发现 |A| + |B| = n可以取的最大值,那么这种方案能否构造成功呢?
设 i 为在B中取的元素个数, j 为在A中取的元素的个数,那么i和j需要满足(假设我们在每个集合都是从小到大取):
1. i+j = n;
2. i<=5000 && i是偶数;
3. j<=15000 && j%3不等于1;
随便证一证都可以发现只要 n>3 那么一定有解(不放心的话你甚至可以打表)
#include<bits/stdc++.h> #define ll long long using namespace std; bool v[30005]; int n,a[20005],t; int main(){ scanf("%d",&n); if(n==3){ puts("2 5 63"); return 0;} for(int i=2;i<n;i+=2) if((n-i)<=15000&&i<=5000&&(n-i)%3!=1){ for(int j=2,c=1;j<=30000&&c+i<=n;j+=2,c++) printf("%d ",j); for(int j=3,c=1;j<=30000&&c<=i;j+=3) if(j&1) printf("%d ",j),c++; break; } return 0; }