// TLE版を修正. // 自力解答不可(※計算量削減が分からない)のため, 正解者様のソースを参照. // https://yukicoder.me/submissions/139856 #include using namespace std; using LL = long long; double EPS = 0.0000000000001; vector D; // nをD[m]以上のk個の約数で分解する方法 LL dec(LL n, LL m, int k){ if(k == 0){ if(n == 1) return 1; else return 0; } if(k == 1){ if(n >= D[m]) return 1; else return 0; } if(pow(n, 1.0 / k) + EPS < D[m]) return 0; LL ret = 0; for(int d = m; d < D.size(); d++){ if(n < D[d] * D[d]) break; if(n % D[d] == 0){ LL nn = n; int cnt = 1; while(nn % D[d] == 0 && k >= cnt){ nn /= D[d]; ret += dec(nn, d + 1, k - cnt); cnt++; } } } return ret; } vector div(LL n){ vector ret; for(LL d = 2; d * d <= n; d++) { if(n % d == 0) { ret.push_back(d); if(d * d != n) ret.push_back(n / d); } } ret.push_back(n); sort(ret.begin(), ret.end()); return ret; } int main() { // 1. 入力情報取得. LL N, X; // cin >> N >> X; scanf("%llu %llu", &N, &X); // 2. X + 1 を 素因数分解. D = div(X + 1); // 3. 出力 ~ 後処理. LL ans = dec(X + 1, 0, N); printf("%llu\n", ans); return 0; }