CF 553B 构造

题目链接:http://codeforces.com/problemset/problem/553/B


思路:方法较无脑,直接手动写几个式子,发现之可能两个相邻的数字交换,且交换的数字不能重叠。知道这个后,稍微想一下如果在当前串再加入数字的话总数目可以由上一个的数目和上上个的数目推出,类似fibonaci数列,那么直接推好了。。



代码:

#include 
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
using namespace std;
const int maxn = 100005;

ll fib[1005];
void pre()
{
	fib[0] = 0;
	fib[1] = 1;fib[2] = 2;
	for(int i = 3;i < 1005;i++)
		fib[i] = fib[i - 1] + fib[i - 2];
}
int n;
ll k;
int ans[105];

int main()
{
	pre();
	while(cin>>n>>k)
	{
		for(int i = 1;i <= 100;i++)ans[i] = i;
		k--;
		for(int i = 1;i < n;i++)
		{
			int cnt = n - i + 1;
			if(k <= fib[cnt] && k >= fib[cnt - 1]){
				k -= fib[cnt - 1];
				swap(ans[i],ans[i + 1]);
				i++;
			}
		}
		for(int i = 1;i <= n;i++)
		{
			printf("%d ",ans[i]);
		}printf("\n");
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章