

Tính tổng số chính phương từ 1->n giới hạn 1<=n<=10^18
Ngôn ngữ go, c#
Hãy luôn nhớ cảm ơn và vote 5*
nếu câu trả lời hữu ích nhé!
\(\circ\) Số chính phương là gì?
\(\implies\) là số nếu có bình phương là một số nguyên.
- Ta có \(1^1=1;\ 2^2=4;\ 3^2=9;\ 4^2=16;\ \dots\)
\(\implies\) Số \(1;\ 4;\ 9;\ 16;\ \dots\) là số chính phương.
\(\implies\) Dễ dàng nhận ra, số lượng số chính phương nằm trong đoạn từ \(1\to n\) là phần nguyên của \(\sqrt{n}.\)
\(\circ\) Gọi \(k=\lfloor\sqrt{n}\rfloor\) (làm tròn \(\sqrt{N}.\))
\(\circ N = 20 \implies k=\lfloor\sqrt{20}\rfloor = 4.\)
\(\circ\) Công thức tính tổng bình phương liên tiếp (với \(k\) là tham số) :
\(S = \sum\limits_{i=1}^{k} i^2 = \dfrac{k \cdot (k+1) \cdot (2k+1)}{6}.\)
(Ảnh là công thức trong tập hợp 13 công thức tổng dãy số).
\(\circ\) Giới hạn đề : \(1\leq n\leq 10^{18}.\)
\(\implies\) Giới hạn quá to, không thể dùng kiểu dữ liệu bình thường được.
\(\implies\) Nếu C#, Go ta dùng cấu trúc BigInteger giải quyết vấn đề.
- Code từ C#:
using System;
class Program {
static void Main() {
ulong n = ulong.Parse(Console.ReadLine());
ulong k = (ulong)Math.Sqrt(n);
if ((k + 1) * (k + 1) <= n) k++;
if (k * k > n) k--;
ulong ans = k * (k + 1) * (2 * k + 1) / 6;
Console.WriteLine(ans);
}
}Hãy giúp mọi người biết câu trả lời này thế nào?

Bảng tin
5006
445
2913
ghê v =))
209
1658
84
ans??? => tưởng phải ghi kq chứ?
209
1658
84
/home/Program.cs(4,31): warning CS8604: Possible null reference argument for parameter 's' in 'ulong ulong.Parse(string s)'. sai kìa
61
1317
3
code trên nào? Với VS Code hay Online nào đấy?
209
1658
84
chạy trên phần mềm mà
61
1317
3
vẫn run dc
209
1658
84
no no no