AGC 022 B

题面在这里!

    锻炼脑子的小构造题。。。

    一开始被 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;
}
原文地址:https://www.cnblogs.com/JYYHH/p/9301358.html