memo[ n ] = n番目の数
- const int N = 2000 * 2000;
- lli memo[N];
- lli A(lli n, lli p, lli q)
- {
- if (n < N) {
- lli &ret = memo[n];
- if (ret != -1) return ret;
- return ret = A(n / p, p, q) + A(n / q, p, q);
- }
- return A(n / p, p, q) + A(n / q, p, q);
- }
- class InfiniteSequence {
- public:
- long long calc(long long n, int p, int q)
- {
- fill(memo, memo + N, -1);
- memo[0] = 1;
- return A(n, p, q);
- }
- };