문제 링크
풀이
- 먼저 첫째날에
x
개, 둘째날에y
개 줬다고 했을 때d
째 날에x
와y
를 이용한 연립방정식을 구한다.- 이건
DP
로 풀면 된다.x
와y
는 따로 계산 될 것이니 각{0, 1, 0, }
,{0, 0, 1, }
로 초기화해서 전전날과 전날의 합을 구하면 된다. - 예를 들어, 여섯 번째 날에
x
와y
의 연립방정식을 구하고 싶다면,x[6]
에 있는3
,y[6]
에 있는5
를 이용해3x+5y
라는 식을 만들 수 있다.
- 이건
- 식을 구했으니 이젠 완전 탐색을 이용해
x
와y
를 구하면 된다. 단, 여기서y
는x
보다 크거나 같아야 하므로 내부의 반복문은i
부터 시작하도록 한다. x[d]*i+y[d]*j
가k
와 같다면 출력하고 return한다.
코드
#include <iostream>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int d, k;
cin >> d >> k;
// 첫째날에 x개, 둘째날에 y개 줬다 했을 때
// d번째 날에 x와 y의 연립방정식
int x[31] = { 0,1,0, };
int y[31] = { 0,0,1, };
for (int i = 3; i <= d; i++)
{
x[i] = x[i - 2] + x[i - 1];
y[i] = y[i - 2] + y[i - 1];
}
for (int i = 1; i <= k; i++)
{
for (int j = i; j <= k; j++)
{
if (k == x[d] * i + y[d] * j)
{
cout << i << '\n' << j;
return 0;
}
}
}
}
문제 링크
풀이
- 먼저 첫째날에
x
개, 둘째날에y
개 줬다고 했을 때d
째 날에x
와y
를 이용한 연립방정식을 구한다.- 이건
DP
로 풀면 된다.x
와y
는 따로 계산 될 것이니 각{0, 1, 0, }
,{0, 0, 1, }
로 초기화해서 전전날과 전날의 합을 구하면 된다. - 예를 들어, 여섯 번째 날에
x
와y
의 연립방정식을 구하고 싶다면,x[6]
에 있는3
,y[6]
에 있는5
를 이용해3x+5y
라는 식을 만들 수 있다.
- 이건
- 식을 구했으니 이젠 완전 탐색을 이용해
x
와y
를 구하면 된다. 단, 여기서y
는x
보다 크거나 같아야 하므로 내부의 반복문은i
부터 시작하도록 한다. x[d]*i+y[d]*j
가k
와 같다면 출력하고 return한다.
코드
#include <iostream>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int d, k;
cin >> d >> k;
// 첫째날에 x개, 둘째날에 y개 줬다 했을 때
// d번째 날에 x와 y의 연립방정식
int x[31] = { 0,1,0, };
int y[31] = { 0,0,1, };
for (int i = 3; i <= d; i++)
{
x[i] = x[i - 2] + x[i - 1];
y[i] = y[i - 2] + y[i - 1];
}
for (int i = 1; i <= k; i++)
{
for (int j = i; j <= k; j++)
{
if (k == x[d] * i + y[d] * j)
{
cout << i << '\n' << j;
return 0;
}
}
}
}