题目链接: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");
}
}