题目如下:
思路 or 题解
0 ≤ N ≤ 1 0 18 0\le N \le 10^{18} 0≤N≤1018 数据范围很大所以不可能从前到后递推得到答案
所以我们可以考虑从后向前推出答案
标准的dfs因为回溯太深的原因 时间复杂度太高
我们可以发现在dfs中得到的结果,在其他dfs中也会被用到,所以就可以进行记忆化搜索了!
AC代码如下:
#define int long long
//#define ll long long
#define PII pair<int, int>
#define px first
#define py second
typedef std::mt19937 Random_mt19937;
Random_mt19937 rnd(time(0));
using namespace std;
const int mod = 1e9 + 7;
const int N = 100009;
int n;
map<int, int> mp;
int dfs(int x)
{
if (mp.count(x))
return mp[x];
if (x == 0)
return 1;
return mp[x] = dfs(x / 2) + dfs(x / 3);
}
void solve()
{
cin >> n;
cout << dfs(n);
}
signed main()
{
buff;
solve();
}