題目鏈接: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");
}
}