#include #include #include using namespace std; //約数列挙のアルゴリズム vector enum_divisors(long long N) { vector res; for (long long i = 1; i * i <= N; ++i) { if (N % i == 0) { res.push_back(i); // 重複しないならば i の相方である N/i も push if (N / i != i) res.push_back(N / i); } } // 小さい順に並び替える sort(res.begin(), res.end()); return res; } int main(void) { long long N,K,ans=0; cin >> N >> K; //step1: Kの約数列挙 vector divisors = enum_divisors(K); long long a[2],sum=0; //step2: 個数のカウント for (int i = 0; i < divisors.size() / 2; i++) { sum = 0; a[0] = divisors[i]; a[1] = divisors[divisors.size() - 1 - i]; if (N < (a[0] - 1)) sum = max((long long)0, (a[0] - 1 - 2 * (a[0] - 1 - N))); else sum = a[0] - 1; if (N < (a[1] - 1)) sum *= max((long long)0, (a[1] - 1 - 2 * (a[1] - 1 - N))); else sum *= a[1] - 1; ans += (2*sum); } if (divisors.size() % 2) { a[0] = divisors[divisors.size() / 2]; long long tmp = max((long long)0, (a[0] - 1 - 2 * (a[0] - 1 - N))); if (N < (a[0] - 1)) sum = tmp * tmp; else sum = (a[0] - 1) * (a[0] - 1); ans += sum; } cout << ans << endl; }