주어진 정수 X를 X와 같거나 가장 가까운 작은 수로 계속 빼면 된다.
마치 동전을 큰 단위부터 거슬러주면 제일 적은 개수로 거슬러 줄 수 있듯이,
가능한 큰 수로 계속 빼면 그것이 최소 개수로 표현할 수 있는 피보나치 수의 합이다.
ACM ICPC 2012 인터넷예선 D번 Fibonacci Numbers
#include <bits/stdc++.h> using namespace std; typedef long long lld; vector<lld> fibo; lld bound(vector<lld>& v, const lld& value){ int l=0, r=v.size(); while(l <= r){ int mid=(l+r)/2; if(v[mid] <= value) l = mid+1; else r = mid-1; } return v[r]; } vector<lld> trace; void f(lld n){ if(n <= 0){ for(int i=trace.size()-1; i>=0; --i) printf("%lld ", trace[i]); puts(""); return; } lld sel = bound(fibo, n); trace.push_back(sel); f(n - sel); } int main(){ lld c=0, p=1; while(c <= 1e10){ fibo.push_back(c); lld t = p; p = c + p; c = t; } int T; scanf("%d", &T); while(T--){ lld n; scanf("%lld", &n); trace = {}; f(n); } return 0; }
댓글 없음:
댓글 쓰기