---
# System prepended metadata

title: D - ABC Problem Answer
tags: [競プロ]

---

競プロ開始初日の明が解いた問題。満点のコードです

```cpp=
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

int main () {
  ll N,M;
  cin>>N>>M;

  unsigned int cnt = 0;

  // cbrt(N) as maximum of A
  for (ll a=1; a*a*a<=N; a++) {
    auto bc = N / a;
    auto b_plus_c = M - a;

    // Calculate b and c using x^2 + (b+c)x + bc = 0
    auto left_side = b_plus_c / 2.0;
    auto right_side = sqrt(powl((b_plus_c), 2) / 4 - (bc));
    auto b = left_side - right_side;
    auto c = left_side + right_side;

    // Skip non-integer values
    if (floor(b) != ceil(b) || floor(c) != ceil(c)) {
      continue;
    }

    if (a * b * c != N || a + b + c != M) {
      continue;
    }

    int cnt_to_add;

    if (a == b && b == c) {
      cnt_to_add = 1;
    } else if ((a != b && b == c)
            || (a == b && b != c)
            || (a != b && b != c && b*b*b <= N)) {
      cnt_to_add = 3;
    } else {
      cnt_to_add = 6;
    }

    //cout<<a<<" "<<b<<" "<<c<<" "<<cnt_to_add<<endl; // debug

    cnt += cnt_to_add;
  }

  cout<<cnt<<endl;

  return 0;
}
```