/** * code generated by JHelper * More info: https://github.com/AlexeyDmitriev/JHelper * @author edamat */ #include using namespace std; #define _overload3(_1, _2, _3, name, ...) name #define _rep(i, n) repi(i, 0, n) #define repi(i, a, b) for(int i = int(a), i##_len = (b); i < i##_len; ++i) #define rep(...) _overload3(__VA_ARGS__, repi, _rep, )(__VA_ARGS__) #define _repr(i, n) repri(i, n, 0) /* loop in [n,m] step -1 */ #define repri(i, a, b) for(int i = int(a), i##_len = (b); i >= i##_len; --i) /* loop in [n,0] step -1 or [n,m] step -1 */ #define repr(...) _overload3(__VA_ARGS__, repri, _repr, )(__VA_ARGS__) #define all(x) (x).begin(), (x).end() #define debug(x) cerr << #x << ": " << (x) << '\n' #define pb push_back #define append emplace_back #define eb emplace_back #define endl '\n' typedef long long lint; #define int lint const int INF = numeric_limits::max(); //int MOD = (int) 1e9 + 7; //const double EPS = 1e-9; const lint LINF = (lint) (1LL << 62) - 1; typedef vector vint; typedef pair pint; struct IoSetup { IoSetup() { cin.tie(nullptr); ios::sync_with_stdio(false); // cout << fixed << setprecision(20); // cerr << fixed << setprecision(20); } } iosetup; using std::to_string; auto to_string(std::string s) -> std::string { return '"' + s + '"'; } auto to_string(char c) -> std::string { return "'" + std::string{c} + "'"; } auto to_string(const char *s) -> std::string { return to_string((std::string) s); } auto to_string(bool b) -> std::string { return (b?"true":"false"); } template auto to_string(std::pair p) -> std::string { return "(" + to_string(p.first) + ", " + to_string(p.second) + ")"; } template auto to_string(std::bitset bs) -> std::string { std::string res{}; for(size_t i = 0; i < N; i++) res.insert(res.begin(), bs.test(i)?'1':'0'); return res; } template auto to_string(T v) -> std::string { bool flg = false; std::string res = "["; for(auto const &x : v){ if(flg) res += ", "; else flg = true; res += to_string(x); } res += "]"; return res; } #define UNIQUE(v) v.erase(unique(v.begin(), v.end()), v.end()); #define SZ(x) ((int)(x).size()) /* range macro. usage: for(int i:range(n)) */ class range { private: struct I { int x; int operator*() { return x; } bool operator!=(I &lhs) { return x < lhs.x; } void operator++() { ++x; } }; I i, n; public: range(int n) : i({0}), n({n}) {} range(int i, int n) : i({i}), n({n}) {} I &begin() { return i; } I &end() { return n; } }; /* keep a max,min */ template bool chmax(T &a, const T &b) { if(a < b){ a = b; return 1; } return 0; } template bool chmin(T &a, const T &b) { if(a > b){ a = b; return 1; } return 0; } /* input,output operator for pair and vector */ template ostream &operator<<(ostream &os, const pair &p) { os << p.first << " " << p.second; return os; } template istream &operator>>(istream &is, pair &p) { is >> p.first >> p.second; return is; } template ostream &operator<<(ostream &os, const vector &v) { for(int i = 0; i < (int) v.size(); i++){ os << v[i] << (i + 1 != v.size()?" ":""); } return os; } template ostream &operator<<(ostream &os, const vector> &v) { for(int i = 0; i < (int) v.size(); i++){ os << v[i] << (i + 1 != v.size()?"\n":""); } return os; } template istream &operator>>(istream &is, vector &v) { for(T &in : v) is >> in; return is; } template ostream &operator<<(ostream &os, const map &mp) { os << "{"; for(auto x = mp.begin(); x != mp.end(); ++x){ os << x->first << ":" << x->second << (x != prev(mp.end())?", ":""); } os << "}"; return os; } /* initialize vector. usage: auto v = male_v(N,0); */ template vector make_v(size_t a) { return vector(a); } template auto make_v(size_t a, Ts... ts) { return vector(ts...))>(a, make_v(ts...)); } /* fill vector. usage: fill_v(v,0); */ template typename enable_if::value == 0>::type fill_v(T &t, const V &v) { t = v; } template typename enable_if::value != 0>::type fill_v(T &t, const V &v) { for(auto &e : t) fill_v(e, v); } /* sum */ template lint sum(vector &v) { lint ret = 0; for(auto x : v){ ret += x; } return ret; } double sum(vector &v) { double ret = 0; for(auto x : v){ ret += x; } return ret; } template auto sum(const T &a) { return a; } template auto sum(const T &first, const A &... rest) { return sum(first) + sum(rest...); } /* mod */ lint intpow(lint a, lint n, lint mod) { lint res = 1; while(n > 0){ if(n & 1) res = res * a % mod; a = a * a % mod; n >>= 1; } return res; } template T intpow(T a, lint n) { T res = 1; while(n > 0){ if(n & 1) res = res * a; a = a * a; n >>= 1; } return res; } long long modinv(long long a, long long m) { long long b = m, u = 1, v = 0; while(b){ long long t = a / b; a -= t * b; swap(a, b); u -= t * v; swap(u, v); } u %= m; if(u < 0) u += m; return u; } struct RandomNumberGenerator { mt19937 mt; RandomNumberGenerator() : mt(chrono::steady_clock::now().time_since_epoch().count()) {} int operator()(int a, int b) { // [a, b) uniform_int_distribution dist(a, b - 1); return dist(mt); } int operator()(int b) { // [0, b) return (*this)(0, b); } }; vector divisor(int64_t n){ vector ret; for(int64_t i = 1; i * i <= n; i++){ if(n % i == 0){ ret.push_back(i); if(i * i != n) ret.push_back(n / i); } } sort(begin(ret), end(ret)); return (ret); } class B { public: static constexpr int kStressIterations = 0; static void generateTest(int cnt, std::ostream &test) { RandomNumberGenerator rng; } void solve(std::istream &cin, std::ostream &cout) { lint N, K; cin >> N >> K; auto d = divisor(K); lint ans = 0; for(lint x:d){ ans += max(min(2 * N - x + 1, x - 1) * min(2 * N - K / x + 1, K / x - 1),0LL); // cout << min(2 * N - x + 1, x - 1) * min(2 * N - K / x + 1, K / x - 1) << endl; } cout << ans << endl; } }; signed main() { B solver; std::istream& in(std::cin); std::ostream& out(std::cout); solver.solve(in, out); return 0; }