#include using namespace std; using LL = long long; const LL MOD = 1e6 + 3; // 与えられた正の整数から文字列を作成して返却. // @param a: 正の整数. // @param b: 正の整数. // @param c: 正の整数. // @return ret: 生成した文字列. string exString(LL a, LL b, LL c){ string ret; LL arr[2]; arr[0] = a, arr[1] = b, arr[2] = c; sort(arr, arr + 2); ret = to_string(arr[0]); ret += '_'; ret += to_string(arr[1]); ret += '_'; ret += to_string(arr[2]); return ret; } int main() { // 1. 入力情報取得. LL L; cin >> L; // 2. 3辺を計算して, 条件に合うか確認. // m, n (m > n) を 奇数として, 以下を確認していく. // a = (m * m - n * n) / 2; // b = m * n; // c = (m * m + n * n) / 2; // -> a * a + b * b = c * c を満たしているため. LL limit = sqrt(L / 4.0) + 1; // cout << "limit=" << limit << endl; map rTriangle; for(LL n = 1; n <= limit; n += 2){ for(LL m = n + 2; m <= limit; m += 2){ LL a = (m * m - n * n) / 2; LL b = m * n; LL c = (m * m + n * n) / 2; // ex. // [入力値] // 8765 // -> 182 で 不正解. // 152 が 正解とのことで, // "回転や裏返した形状のものは、同一の形状とみなします。" との問題文の指示を再確認. // ex. // m=7 n=1 a=24 b=7 c=25 と m=35 n=5 a=600 b=175 c=625 は, 同じ結果と判定する. // // a, b, c の 最大公約数で, 割ってみる. LL gcd = __gcd(a, b); gcd = __gcd(gcd, c); a /= gcd, b /= gcd, c /= gcd; string s = exString(a, b, c); if(a + b + c <= L / 4 && rTriangle[s] == 0){ rTriangle[s]++; // cout << "m=" << m << " n=" << n << " a=" << a << " b=" << b << " c=" << c << " s=" << s << endl; } } } // 3. 出力 ~ 後処理. // ex. // [入力値] // 10000000 // -> 175570 で, OK? LL ans = rTriangle.size(); ans %= MOD; cout << ans << endl; return 0; }