
오히려 처음 생각한 방정식 풀이 방식이 맞았다...
그런데 루프 한개로 A만 바꿔서 B를 구하는걸 이해를 못하겠다...
#include <iostream>
#include <vector>
using namespace std;
void find_answer(int D, int K) {
//어제 받은 떡 + 그저께 받은 떡 받아야 무사히 보내줌
//D : 넘어온 날
//K : 그날 호랑이에게 준 떡의 개수
/*
vector<int> DP(D + 1, 0);
int i, j, k;
for (i = 1; i < D; i++) {
DP[1] = i;
for (j = 1; j <= K; j++) {
DP[2] = j;
//cout << "A : " << DP[1] << " | B : " << DP[2] << " : ";
for (k = 3; k <= D; k++) {
DP[k] = DP[k - 2] + DP[k - 1];
if (DP[k] > K) {
break;
}
//cout << DP[k] << " ";
}
//cout << "\n";
if (DP[D] == K) {
cout << DP[1] << "\n" << DP[2] << "\n";
return;
}
}
}
*/
vector<int> A(D + 1, 0);
vector<int> B(D + 1, 0);
int i, current;
A[1] = 1;
A[2] = 0;
B[1] = 0;
B[2] = 1;
for (i = 3; i <= D; i++) {
A[i] = A[i - 2] + A[i - 1];
B[i] = B[i - 2] + B[i - 1];
}
//cout << "A * " << A[D] << " + " << "B * " << B[D] << " = " << K << "\n";
//이중 for문을 돌릴수도 있지만.
//X*A + Y*B = K니까 K - A[i]*A = B[i]*B고, B[i]값은 알고 있으니까
for (i = 1; i <= K; i++) {
current = K - (A[D] * i);
cout << A[D] << " * " << i << " + " << B[D] << " * " << current / B[D] << " = " << A[D] * i + current << "\n";
if (current % B[D] == 0) {
cout << i << "\n" << current / B[D] << "\n";
break;
}
}
return;
}
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int D, K;
cin >> D >> K;
find_answer(D, K);
return 0;
}