/* この問題は、TLが長いことを利用すると工夫したメモ化全探索で通すことができます 方針としては、大きい値から小さい値の順でdfsを行います */ #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #pragma GCC target("popcnt,bmi2,fma,fma4,avx512f,avx512dq,avx512cd,avx512bw,avx512vl") #include #include constexpr long long base = 10000000001; int n; long long res, k; int main() { std::cin >> n >> k; std::unordered_map mp; auto dfs = [&](auto self, long long nk, int val) -> long long { if(val == 0) return 1ll; //pairで持つとTLEしたので、適当な数を掛けてlong longひとつに状態を持たせています long long key = val * base + nk; if(mp[key]) return mp[key]; //使わない場合と使う場合 return mp[key] = self(self, nk, val - 1) + (nk / val ? self(self, nk / val, val - 1) : 0); }; std::cout << dfs(dfs, k, n) - 1 << '\n'; return 0; }