SRM413: InfiniteSequence2
(問題概要)
A_i = 1 for all i <= 0;
A_i = A_[i/p]-x + A_[i/q]-y
A_nを求めよ。(n < 10^13)
(解法)
メモ化再帰。
ただし全部をmap等でメモるとMLEでセグるので、部分的にメモる。
なんかチーター本で見たような気もする。
typedef long long ll; #include <queue> #include <set> #include <iostream> #include <sstream> using namespace std; class InfiniteSequence2 { public: long long calc(long long n, int p, int q, int x, int y); }; ll memo[1000000]; int p; int q; int x; int y; ll solve(ll n){ if(n <= 0) return 1; if(n < 1000000 && memo[n] != -1) return memo[n]; ll ret = solve(n / p - x) + solve(n / q - y); if(n < 1000000) memo[n] = ret; return ret; } long long InfiniteSequence2::calc(long long n, int p, int q, int x, int y){ ::p = p; ::q = q; ::x = x; ::y = y; memset(memo, -1, sizeof(memo)); return solve(n); }