思路
状态:dp[i]表示长度为i的方案数
初始状态:dp[0]=1,dp[1]=2
状态转移:dp[i]=dp[i-1]+dp[i-2],在长度为i-1的串的前面加0,在长度为i-2的串前面加10
对于第i位如果k大于dp[i-1],那么说明这一位时1(k减去dp[i-1]),不然这一位就是0,因为如果这一位是0,那么k最大只能为dp[i-1]
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mem(a,b) memset(a,b,sizeof(a)) int dp[55]; int main(){ ios::sync_with_stdio(false); cin.tie(0); int n,k; cin>>n>>k; dp[0]=1; dp[1]=2; for(int i=2;i<=n;i++){ dp[i]=dp[i-1]+dp[i-2]; } if(k>dp[n]){ cout<<-1<<endl; return 0; } while(n){ if(k>dp[n-1]){ k-=dp[n-1]; cout<<1; } else { cout<<0; } n--; } cout<<endl; return 0; }