题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1105
题解:这题你会巧妙的发现
1-(1),2-(10),3-(100),5-(1000),8-(10000),13-(100000)
刚好是一个斐波那契数列,当然这不是巧合。因为n可以有n-2,n-4,n-6....或者由n-3,n-5,n-7...也就是说可以由前面那些组成。所以可以先用斐波那契找一下大致位置人后再利用贪心补位即可。
#include <iostream> #include <cstring> #include <cstdio> #include <vector> using namespace std; typedef long long ll; vector<int>vc; ll fib[100]; char s[100]; void getfib() { fib[0] = 1 , fib[1] = 1; for(int i = 2 ; i < 50 ; i++) fib[i] = fib[i - 1] + fib[i - 2]; } int main() { int t , Case = 0; getfib(); scanf("%d" , &t); while(t--) { ll n; scanf("%lld" , &n); vc.clear(); for(int i = 0 ; i < 100 ; i++) s[i] = '0'; ll ans = 0; for(int i = 49 ; i >= 0 ; i--) { if(ans + fib[i] > n) continue; ans += fib[i]; vc.push_back(i); } int len = vc.size(); int Max = vc[0]; for(int i = 0 ; i < len ; i++) { s[vc[i] - 1] = '1'; } printf("Case %d: " , ++Case); for(int i = Max - 1 ; i >= 0 ; i--) putchar(s[i]); printf(" "); } return 0; }