NC14979. 闯关的lulu
描述
勇者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层时身上的数字
示例1
输入:
4 1 2 3 20
输出:
0 11 110 32211
Python3(3.5.2) 解法, 执行用时: 30ms, 内存消耗: 3432K, 提交时间: 2020-02-09 19:53:00
import math n = int(input()) while n > 0: ans = "" t = int(input()) t = 4 * (t // 2) + (t & 1) for x in reversed(range(0, 20)): while t >= math.factorial(x + 1): ans = ans + str(x) t = t - math.factorial(x + 1) print(ans) n = n - 1
C 解法, 执行用时: 2ms, 内存消耗: 384K, 提交时间: 2023-05-20 09:16:20
#include<stdio.h> void put(int n,int k){ if(n==0) return; put(n/(k+2),k+1); n=n%(k+2); while(n--) printf("%d",k); } int main() { int t,n; scanf("%d",&t); while(t--){ scanf("%d",&n); if(n%2!=0){ put(n-1,1); printf("0"); } else{ put(n,1); } printf("\n"); } }
C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 472K, 提交时间: 2019-02-13 11:27:53
#include<stdio.h> int main(){ int i,a[11]={1},n,f,t; scanf("%d",&t); while(t--){ for(i=0;i<11;i++) a[i+1]=a[i]*(i+2); scanf("%d",&f); n=(f&1)+f/2*4; for(i=10;i>-1;--i) n>=a[i]&&printf("%d",i)&&(n-=a[i++]); printf("\n"); } return 0; }