dp[i]表示最大为i位的数总共有多少个
然后跟据这个DFS出解
AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int dp[500];
char s[500];
void init(){
dp[0] = 1;
dp[1] = 1;
for( int i = 2; i < 500; i++ ){
dp[i] = dp[i-1] + dp[i-2];
}
}
void DFS( int pos, int N ){
if( pos < 1 ){
return;
}
if( dp[pos] <= N ){
s[pos] = '1';
DFS( pos - 1, N - dp[pos] );
}else{
s[pos] = '0';
DFS( pos - 1, N );
}
return;
}
void solve( int N ){
int pos = 1;
while( 1 ){
if( dp[pos] <= N && dp[pos+1] > N ){
break;
}
pos++;
}
DFS( pos, N );
for( int i = pos; i >= 1; i-- ){
cout << s[i];
}
}
int main(){
int T, N, Case = 1;
init();
cin >> T;
while( T-- ){
cin >> N;
printf( "Case %d: ", Case++ );
solve( N );
cout << endl;
}
return 0;
}