• 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;
    }
    
  • 相关阅读:
    国庆·生日
    国足
    Eason's concert
    今天的斩获
    The 4400
    闷热
    24
    一直登录不了。。。原来是因为。。。
    黄色暴雨警告
    绝密飞行
  • 原文地址:https://www.cnblogs.com/JYYHH/p/9301358.html
Copyright © 2020-2023  润新知