Codeforces Round #514 (Div. 2) - C Sequence Transformation (思维gcd)

C. Sequence Transformation

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Let's call the following process a transformation of a sequence of length nn.

If the sequence is empty, the process ends. Otherwise, append the greatest common divisor (GCD) of all the elements of the sequence to the result and remove one arbitrary element from the sequence. Thus, when the process ends, we have a sequence of nn integers: the greatest common divisors of all the elements in the sequence before each deletion.

You are given an integer sequence 1,2,…,n1,2,…,n. Find the lexicographically maximum result of its transformation.

A sequence a1,a2,…,ana1,a2,…,an is lexicographically larger than a sequence b1,b2,…,bnb1,b2,…,bn, if there is an index ii such that aj=bjaj=bj for all j<ij<i, and ai>biai>bi.

Input

The first and only line of input contains one integer nn (1≤n≤1061≤n≤106).

Output

Output nn integers  — the lexicographically maximum result of the transformation.

Note

In the first sample the answer may be achieved this way:

  • Append GCD(1,2,3)=1(1,2,3)=1, remove 22.
  • Append GCD(1,3)=1(1,3)=1, remove 11.
  • Append GCD(3)=3(3)=3, remove 33.

We get the sequence [1,1,3][1,1,3] as the result.

比赛时候真的没读明白题,以为随便删除元素,然后要输出序列递增这样,结果wa的心累。

题目大意:

给你一个数字n,然后从从1,2,3......n这个序列中

依次进行以下操作:1 、求所有数的最大公因数,放入a序列里面

         2 、任意删去一个元素

一直到初始N序列为空,结束操作,打印这个a序列。

根据删除元素的不同,导致序列a的字典序可能不同,

要求输出字典序最大的a序列。

题解:

学到了两个特性:

  1. gcd(a1,a2,a3,a4.....an)  <= min(a1,a2,a3,a4...an),所有数的gcd值一定小于所有数的最小值
  2. 任意两个相邻的数字gcd等于1,比如:gcd(4,5)= 1

咱们看序列,比如N=8:(  1  ,2   , 3  ,  4  ,5  ,6  ,7  ,8 )

先举例8个数   首先,你这个开头的1不删除,你的gcd永远不可能超过1,所以第一个删除的数字就是这个1

其次,相邻两个数gcd等于1,为了让gcd尽早的大于1,那么对于3,5,7,我们都应该删除(这时候不能删除2,4,6,8,原因你可以自己思考),这样会使gcd的值变大。

那么就删除3,5,7这3个元素

序列中生下了2,4,6,8这4个元素

这时gcd == 2,那么你这个2不删的话,你的gcd永远不可能大于2,所以这个2,是要首先删除的,

剩下4,6,8这三个元素,类比上面的删除中间元素,删除6

剩下两个元素4,8 ,当序列中只剩下两个元素的时候,先输出两个数gcd,然后输出最大的数即可

总结一下就是:删除1,3,5,7。。。。。

       删除2,6,10 ,14 。。。。。

       删除4 ,12,20,28 .。。。。

当然上面讨论的都是偶数的情况,奇数的情况是否使用呢?

其实奇数的情况和偶数的情况是一样的,无非就是1,2,3,4,5

删除1,剩下2,3,4,5

其实就是先删掉序列中奇数,然后偶数从小往大删,输出gcd即可。

#include <bits/stdc++.h>
using namespace std;
void dfs(int n,int x) {
	if (n<=3) {
		int i;
		for (i=1; i<n; i++) {
			printf("%d ",x);
		}
		printf("%d ",n*x);
		return;
	}
	int i;
	for (i=1; i<=n; i+=2) {
		printf("%d ",x);
	}
	dfs(n/2,x*2);
}
int main() {
	int n;
	scanf("%d",&n);
	dfs(n,1);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值