链接:https://www.nowcoder.com/acm/contest/67/J
来源:牛客网
题目描述
勇者lulu某天进入了一个高度10,000,000层的闯关塔,在塔里每到一层楼,他都会获得对应数量的0 1(看情况获得),然后塔里有一个法则,当你身上某个数字达到一个特定的数量时,它们会合成为下一个数字,现在问题来了,当lulu从1层到达第n层的时候,他身上的数字是多少。
第1层 0
第2层 11
第3层 110
第4层 21
第5层 210
第6层 22
第7层 220
第8层 2211
第9层 22110
第10层 2221
第11层 22210
第12层 3
输入描述:
第一行是样例数T(T<100)
第2到2+T-1行每行有一个整数n(0<n<=10^7)。
输出描述:
从大到小输出lulu到达第n层时身上的数字
输入例子:
4
1
2
3
20
输出例子:
0
11
110
32211
-->
示例1
输入
4
1
2
3
20
输出
0
11
110
32211
备注:
对于100%的数据,
0 < T <= 100
0 < n <= 10^7
题解
规律,模拟。
可以发现每一层都能够获得一个$0$,偶数层额外获得一个$1$,合成的规律也就可以发现了。
然后模拟合并即可。
#include<bits/stdc++.h>
using namespace std; int T;
long long n;
long long a[50]; int main() {
scanf("%d", &T);
while(T --) {
scanf("%lld", &n);
memset(a, 0, sizeof a);
a[0] = n;
a[1] = n / 2;
for(int i = 0; i <= 30; i ++) {
a[i + 1] += (a[i] / (i + 2));
a[i] = a[i] % (i + 2);
}
for(int i = 30; i >= 0; i --) {
while(a[i]) {
printf("%d", i);
a[i] --;
}
}
printf("\n");
}
return 0;
} /* 00 -> 1
111 -> 2
2222 -> 3 + 0
+ 10
+ 0
+ 10
+ 0
+ 10
+ 0
+ 10
+ 0
+ 10
+ 0
+ 10 */