Wunder Fund Round 2016 (Div. 1 + Div. 2 combined)(A)(模拟||规律)

来源:互联网 发布:java file类绝对路径 编辑:程序博客网 时间:2024/05/20 16:11

A. Slime Combining
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Your friend recently gave you some slimes for your birthday. You have n slimes all initially with value 1.

You are going to play a game with these slimes. Initially, you put a single slime by itself in a row. Then, you will add the other n - 1 slimes one by one. When you add a slime, you place it at the right of all already placed slimes. Then, while the last two slimes in the row have the same value v, you combine them together to create a slime with value v + 1.

You would like to see what the final state of the row is after you've added all n slimes. Please print the values of the slimes in the row from left to right.

Input

The first line of the input will contain a single integer, n (1 ≤ n ≤ 100 000).

Output

Output a single line with k integers, where k is the number of slimes in the row after you've finished the procedure described in the problem statement. The i-th of these numbers should be the value of the i-th slime from the left.

Sample test(s)
input
1
output
1
input
2
output
2
input
3
output
2 1
input
8
output
4
Note

In the first sample, we only have a single slime with value 1. The final state of the board is just a single slime with value 1.

In the second sample, we perform the following steps:

Initially we place a single slime in a row by itself. Thus, row is initially 1.

Then, we will add another slime. The row is now 1 1. Since two rightmost slimes have the same values, we should replace these slimes with one with value 2. Thus, the final state of the board is 2.

In the third sample, after adding the first two slimes, our row is 2. After adding one more slime, the row becomes 2 1.

In the last sample, the steps look as follows:

  1. 1
  2. 2
  3. 2 1
  4. 3
  5. 3 1
  6. 3 2
  7. 3 2 1
  8. 4

题意:给你一个数字n,问按照题意规则合并N次后的序列是什么?合并规则是相同的数字2个数字(M,M)合并为M+1



题解:直接模拟就可以了,使用栈还是vector都可以,也可以找一下规律,天啦撸!这一题竟然有规律,而且有人一眼就看穿了ORZ。。。。。,其实规律就是把n转化为二进制,观察可以发现其实就是让你输出在二进制数字为1的位置。例如


7:----->二进制是111,那么就输出3,2,1:

真是神奇的二进制!!!


模拟代码:

#include <set>#include <map>#include <list> #include <cmath> #include <queue> #include <vector>#include <cstdio> #include <string> #include <cstring>#include <iomanip> #include <iostream> #include <sstream>#include <algorithm>#define  LL long long #define inf 0x3f3f3f3fusing namespace std;#define N 1000000vector<int>q;int main(){#ifdef CDZSCfreopen("i.txt","r",stdin);#endifint n;while(~scanf("%d",&n)){q.clear();q.push_back(0);q.push_back(1);for(int i=1;i<n;i++){if(q.back()!=1){q.push_back(1);}else{int t=2;q.pop_back();while(t==q.back()){t=t+1;q.pop_back();}q.push_back(t);}}for(int i=1;i<q.size();i++){printf("%d ",q[i]);}puts("");}return 0;}/*In the last sample, the steps look as follows:122 133 13 23 2 14*/


规律代码:


#include <cstdio>int main(){int i, n;scanf("%d", &n);for (i = 20; i >= 0; i--) if (n >> i & 1) printf("%d ", i + 1);}








0 0
原创粉丝点击