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序列。
题解:
学到了两个特性:
- gcd(a1,a2,a3,a4.....an) <= min(a1,a2,a3,a4...an),所有数的gcd值一定小于所有数的最小值
- 任意两个相邻的数字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;
}