题解 LA3357

题目大意 多组数据,每组数据给定一个正整数 \(n\),要求输出第 \(n\) 大的满足没有前导零或两个相邻的 \(1\) 的二进制串。

分析 我们令 \(a_n\)\(n\) 位的这种串的个数,\(S_n\)\(a\) 的前缀和,有

\[a_n = S_{n-2}+1 \]

这是因为等于从这个串的 \(1,2,\cdots,n-2\) 位上再重新构造一个串,但是没有前导零的限制。

有意思的是 \(a_n\) 正好为斐波那契数列。

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

int T, n;
ll s[50], a[50];

int main()
{
	a[1] = 1, a[2] = 1, s[1] = 1, s[2] = 2;
	for(int i = 3; i <= 44; ++i)
		a[i] = s[i - 2] + 1, s[i] = s[i - 1] + a[i];
		
	scanf("%d", &T);
	while(T--) {
		scanf("%d", &n);
		
		int t = 0, last = 0;
		while(n) {
			last = t, t = 0;
			while(n > s[t + 1]) ++t;
			
			n -= s[t] + 1;
			
			for(int i = t + 1; i <= last - 1; ++i)
				putchar('0');
			putchar('1');
		}
		for(int i = 1; i <= t; ++i)
			putchar('0');
		putchar('\n');
	}
}
posted @ 2020-02-16 22:01  whx1003  阅读(100)  评论(0编辑  收藏  举报