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");
	}
}



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