#include <iostream>
#include <vector>
#include <cmath>
#include <numeric>
using namespace std;
const int MAX_N = 1000000;
// Cấu trúc lưu một điểm tọa độ nguyên
struct Point {
long long x, y;
};
// Hàm tính giá trị tuyệt đối |x| + |y|
long long manhattan_dist(long long x, long long y) {
return abs(x) + abs(y);
}
// Tổng đáp án
long long total_S = 0;
// Hàm xử lý khi có một bộ ba Pytago (a, b, c) với c là mẫu số
void process_pythagorean_triple(long long a, long long b, long long c) {
// Trong thực tế của Problem 450, bạn sẽ không duyệt R, r trực tiếp
// mà sẽ dùng 'c' (và các lũy thừa của c) để tính toán số lượng
// các cặp (R, r) là bội số hợp lệ của c.
// Ví dụ cơ bản (Minh họa logic đại số hóa):
// r phải chứa nhân tử của c^K, với K liên quan đến (R-r)/r.
// Thay vì duyệt, ta cộng dồn số cách chọn R, r thông qua các hàm
// toán học đếm số bội số (Multiples Counting) trong giới hạn N.
/* long long multiples_count = count_valid_pairs(c, MAX_N);
total_S += multiples_count * ...;
*/
}
// Sinh các bộ ba Pytago nguyên thủy bằng thuật toán Berggren (Tree of PPTs)
// a, b là 2 cạnh góc vuông, c là cạnh huyền (mẫu số của sin(t), cos(t))
void generate_PPT(long long a, long long b, long long c) {
// Điều kiện dừng: nếu mẫu số c vượt quá một giới hạn liên quan tới N
// (Lưu ý: Giới hạn thực tế của c phụ thuộc vào phân tích Diophantine của R, r)
if (c > MAX_N) return;
process_pythagorean_triple(a, b, c);
// 3 ma trận sinh nhánh cho cây Pytago
long long a1 = a - 2*b + 2*c;
long long b1 = 2*a - b + 2*c;
long long c1 = 2*a - 2*b + 3*c;
generate_PPT(a1, b1, c1);
long long a2 = a + 2*b + 2*c;
long long b2 = 2*a + b + 2*c;
long long c2 = 2*a + 2*b + 3*c;
generate_PPT(a2, b2, c2);
long long a3 = -a + 2*b + 2*c;
long long b3 = -2*a + b + 2*c;
long long c3 = -2*a + 2*b + 3*c;
generate_PPT(a3, b3, c3);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout << "Bat dau tinh toan T(10^6)..." << "\n";
// Khởi tạo từ bộ ba Pytago nguyên thủy nhỏ nhất (3, 4, 5)
// Các góc thoả mãn sin(t), cos(t) hữu tỉ (ngoại trừ các góc phần tư 0, 90, 180, 270)
// đều được sinh ra từ đây.
generate_PPT(3, 4, 5);
// Xử lý riêng biệt các góc suy biến (degenerate angles)
// tương ứng với c = 1 (tức là t = 0, pi/2, pi, 3pi/2)
// Ở các góc này, điểm sinh ra luôn là số nguyên với mọi R, r.
// Việc của ta là dùng công thức cấp số cộng để tính tổng S(R, r) cho c = 1.
/*
for (long long R = 3; R <= MAX_N; ++R) {
long long max_r = (R - 1) / 2;
// Tính tổng tọa độ bằng công thức O(1) thay vì duyệt r
total_S += calculate_degenerate_sum(R, max_r);
}
*/
cout << "T(10^6) = " << total_S << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxudW1lcmljPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBNQVhfTiA9IDEwMDAwMDA7CgovLyBD4bqldSB0csO6YyBsxrB1IG3hu5l0IMSRaeG7g20gdOG7jWEgxJHhu5kgbmd1ecOqbgpzdHJ1Y3QgUG9pbnQgewogICAgbG9uZyBsb25nIHgsIHk7Cn07CgovLyBIw6BtIHTDrW5oIGdpw6EgdHLhu4sgdHV54buHdCDEkeG7kWkgfHh8ICsgfHl8CmxvbmcgbG9uZyBtYW5oYXR0YW5fZGlzdChsb25nIGxvbmcgeCwgbG9uZyBsb25nIHkpIHsKICAgIHJldHVybiBhYnMoeCkgKyBhYnMoeSk7Cn0KCi8vIFThu5VuZyDEkcOhcCDDoW4KbG9uZyBsb25nIHRvdGFsX1MgPSAwOwoKLy8gSMOgbSB44butIGzDvSBraGkgY8OzIG3hu5l0IGLhu5kgYmEgUHl0YWdvIChhLCBiLCBjKSB24bubaSBjIGzDoCBt4bqrdSBz4buRCnZvaWQgcHJvY2Vzc19weXRoYWdvcmVhbl90cmlwbGUobG9uZyBsb25nIGEsIGxvbmcgbG9uZyBiLCBsb25nIGxvbmcgYykgewogICAgLy8gVHJvbmcgdGjhu7FjIHThur8gY+G7p2EgUHJvYmxlbSA0NTAsIGLhuqFuIHPhur0ga2jDtG5nIGR1eeG7h3QgUiwgciB0cuG7sWMgdGnhur9wCiAgICAvLyBtw6Agc+G6vSBkw7luZyAnYycgKHbDoCBjw6FjIGzFqXkgdGjhu6thIGPhu6dhIGMpIMSR4buDIHTDrW5oIHRvw6FuIHPhu5EgbMaw4bujbmcgCiAgICAvLyBjw6FjIGPhurdwIChSLCByKSBsw6AgYuG7mWkgc+G7kSBo4bujcCBs4buHIGPhu6dhIGMuCiAgICAKICAgIC8vIFbDrSBk4bulIGPGoSBi4bqjbiAoTWluaCBo4buNYSBsb2dpYyDEkeG6oWkgc+G7kSBow7NhKToKICAgIC8vIHIgcGjhuqNpIGNo4bupYSBuaMOibiB04butIGPhu6dhIGNeSywgduG7m2kgSyBsacOqbiBxdWFuIMSR4bq/biAoUi1yKS9yLgogICAgLy8gVGhheSB2w6wgZHV54buHdCwgdGEgY+G7mW5nIGThu5NuIHPhu5EgY8OhY2ggY2jhu41uIFIsIHIgdGjDtG5nIHF1YSBjw6FjIGjDoG0gCiAgICAvLyB0b8OhbiBo4buNYyDEkeG6v20gc+G7kSBi4buZaSBz4buRIChNdWx0aXBsZXMgQ291bnRpbmcpIHRyb25nIGdp4bubaSBo4bqhbiBOLgogICAgCiAgICAvKiBsb25nIGxvbmcgbXVsdGlwbGVzX2NvdW50ID0gY291bnRfdmFsaWRfcGFpcnMoYywgTUFYX04pOwogICAgdG90YWxfUyArPSBtdWx0aXBsZXNfY291bnQgKiAuLi47IAogICAgKi8KfQoKLy8gU2luaCBjw6FjIGLhu5kgYmEgUHl0YWdvIG5ndXnDqm4gdGjhu6d5IGLhurFuZyB0aHXhuq10IHRvw6FuIEJlcmdncmVuIChUcmVlIG9mIFBQVHMpCi8vIGEsIGIgbMOgIDIgY+G6oW5oIGfDs2MgdnXDtG5nLCBjIGzDoCBj4bqhbmggaHV54buBbiAobeG6q3Ugc+G7kSBj4bunYSBzaW4odCksIGNvcyh0KSkKdm9pZCBnZW5lcmF0ZV9QUFQobG9uZyBsb25nIGEsIGxvbmcgbG9uZyBiLCBsb25nIGxvbmcgYykgewogICAgLy8gxJBp4buBdSBraeG7h24gZOG7q25nOiBu4bq/dSBt4bqrdSBz4buRIGMgdsaw4bujdCBxdcOhIG3hu5l0IGdp4bubaSBo4bqhbiBsacOqbiBxdWFuIHThu5tpIE4KICAgIC8vIChMxrB1IMO9OiBHaeG7m2kgaOG6oW4gdGjhu7FjIHThur8gY+G7p2EgYyBwaOG7pSB0aHXhu5ljIHbDoG8gcGjDom4gdMOtY2ggRGlvcGhhbnRpbmUgY+G7p2EgUiwgcikKICAgIGlmIChjID4gTUFYX04pIHJldHVybjsKCiAgICBwcm9jZXNzX3B5dGhhZ29yZWFuX3RyaXBsZShhLCBiLCBjKTsKCiAgICAvLyAzIG1hIHRy4bqtbiBzaW5oIG5ow6FuaCBjaG8gY8OieSBQeXRhZ28KICAgIGxvbmcgbG9uZyBhMSA9ICBhIC0gMipiICsgMipjOwogICAgbG9uZyBsb25nIGIxID0gIDIqYSAtIGIgKyAyKmM7CiAgICBsb25nIGxvbmcgYzEgPSAgMiphIC0gMipiICsgMypjOwogICAgZ2VuZXJhdGVfUFBUKGExLCBiMSwgYzEpOwoKICAgIGxvbmcgbG9uZyBhMiA9ICBhICsgMipiICsgMipjOwogICAgbG9uZyBsb25nIGIyID0gIDIqYSArIGIgKyAyKmM7CiAgICBsb25nIGxvbmcgYzIgPSAgMiphICsgMipiICsgMypjOwogICAgZ2VuZXJhdGVfUFBUKGEyLCBiMiwgYzIpOwoKICAgIGxvbmcgbG9uZyBhMyA9IC1hICsgMipiICsgMipjOwogICAgbG9uZyBsb25nIGIzID0gLTIqYSArIGIgKyAyKmM7CiAgICBsb25nIGxvbmcgYzMgPSAtMiphICsgMipiICsgMypjOwogICAgZ2VuZXJhdGVfUFBUKGEzLCBiMywgYzMpOwp9CgppbnQgbWFpbigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShOVUxMKTsKCiAgICBjb3V0IDw8ICJCYXQgZGF1IHRpbmggdG9hbiBUKDEwXjYpLi4uIiA8PCAiXG4iOwoKICAgIC8vIEto4bufaSB04bqhbyB04burIGLhu5kgYmEgUHl0YWdvIG5ndXnDqm4gdGjhu6d5IG5o4buPIG5o4bqldCAoMywgNCwgNSkKICAgIC8vIEPDoWMgZ8OzYyB0aG/huqMgbcOjbiBzaW4odCksIGNvcyh0KSBo4buvdSB04buJIChuZ2/huqFpIHRy4burIGPDoWMgZ8OzYyBwaOG6p24gdMawIDAsIDkwLCAxODAsIDI3MCkKICAgIC8vIMSR4buBdSDEkcaw4bujYyBzaW5oIHJhIHThu6sgxJHDonkuCiAgICBnZW5lcmF0ZV9QUFQoMywgNCwgNSk7CiAgICAKICAgIC8vIFjhu60gbMO9IHJpw6puZyBiaeG7h3QgY8OhYyBnw7NjIHN1eSBiaeG6v24gKGRlZ2VuZXJhdGUgYW5nbGVzKSAKICAgIC8vIHTGsMahbmcg4bupbmcgduG7m2kgYyA9IDEgKHThu6ljIGzDoCB0ID0gMCwgcGkvMiwgcGksIDNwaS8yKQogICAgLy8g4bueIGPDoWMgZ8OzYyBuw6B5LCDEkWnhu4NtIHNpbmggcmEgbHXDtG4gbMOgIHPhu5Egbmd1ecOqbiB24bubaSBt4buNaSBSLCByLgogICAgLy8gVmnhu4djIGPhu6dhIHRhIGzDoCBkw7luZyBjw7RuZyB0aOG7qWMgY+G6pXAgc+G7kSBj4buZbmcgxJHhu4MgdMOtbmggdOG7lW5nIFMoUiwgcikgY2hvIGMgPSAxLgogICAgLyoKICAgIGZvciAobG9uZyBsb25nIFIgPSAzOyBSIDw9IE1BWF9OOyArK1IpIHsKICAgICAgICBsb25nIGxvbmcgbWF4X3IgPSAoUiAtIDEpIC8gMjsKICAgICAgICAvLyBUw61uaCB04buVbmcgdOG7jWEgxJHhu5kgYuG6sW5nIGPDtG5nIHRo4bupYyBPKDEpIHRoYXkgdsOsIGR1eeG7h3QgcgogICAgICAgIHRvdGFsX1MgKz0gY2FsY3VsYXRlX2RlZ2VuZXJhdGVfc3VtKFIsIG1heF9yKTsgCiAgICB9CiAgICAqLwoKICAgIGNvdXQgPDwgIlQoMTBeNikgPSAiIDw8IHRvdGFsX1MgPDwgIlxuIjsKCiAgICByZXR1cm4gMDsKfQ==