#include using namespace std; #define int long long int N, D; int XY[2*2000*2000+100]; // XY[i]: 左辺がiになる組み合わせの数 int WZ[2*2000*2000+100]; // WZ[i]: 右辺がiになる組み合わせの数 signed main() { cin >> N >> D; // 左辺 (x^2 + y^2) の組み合わせを数える for (int x = 1; x <= N; x++) { for (int y = 1; y <= N; y++) { int left = x*x + y*y; XY[left]++; } } // 右辺 (w^2 - z^2 + D) の組み合わせを数える for (int w = 1; w <= N; w++) { for (int z = 1; z <= N; z++) { int right = w*w - z*z + D; // 式が複雑なので判定を入れておく if (right >= 2 and right <= 2*N*N) { WZ[right]++; } } } int ans = 0; // (値がiとなる左辺の場合の数 * 値がiとなる右辺の場合の数)を足し合わせる for (int i = 2; i <= 2*N*N; i++) { ans += XY[i] * WZ[i]; } cout << ans << endl; return 0; }