baekjoon
[백준] 1351 무한 수열
윤만석
2023. 3. 29. 11:08
문제
무한 수열 A는 다음과 같다.
- A0 = 1
- Ai = A⌊i/P⌋ + A⌊i/Q⌋ (i ≥ 1)
N, P와 Q가 주어질 때, AN을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 3개의 정수 N, P, Q가 주어진다.
출력
첫째 줄에 AN을 출력한다.
똑같은 A[i]를 여러번 계산해야할 수 있으므로, 이를 막아주는 메모제이션 즉 DP를 사용합니다.
DP(int k){
만약 A[k]가 존재한다면 return A[k]
그게 아니라면 return DP(k/P) + DP(k/Q)
}
#include<bits/stdc++.h>
#define FAST ios_base::sync_with_stdio(false),cin.tie(NULL);
#define mset(v) memset(v,0,sizeof(v));
#define rep(i,a) for(int i=0;i<a;++i)
#define REP(i,a) for(int i=1;i<=a;++i)
using namespace std;
typedef long long ll;
typedef pair<int, int> pi;
typedef tuple<int, int, int>ti;
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
int dy[] = { -1,0,1,0 }, dx[] = { 0,1,0,-1 };
ll N, P, Q;
unordered_map<ll,ll>um;
ll n(ll k) {
if (um[k])return um[k];
return um[k] = n(k / P) + n(k / Q);
}
int main() {
FAST;
cin >> N >> P >> Q;
um[0] = 1;
cout << n(N);
}