[Thuật toán] Đếm hình vuông

{$MODE OBJFPC}
program SquareCounter;
const
  InputFile  = 'SQUARES.INP';
  OutputFile = 'SQUARES.OUT';
  m = 2013;
var
  fi, fo: TextFile;
  n: Int64;
  x: array[1..3] of Int64;
  i: Integer;
  res: Int64;
begin
  AssignFile(fi, InputFile); Reset(fi);
  AssignFile(fo, OutputFile); Rewrite(fo);
  try
    while not SeekEof(fi) do
      begin
        ReadLn(fi, n);
        x[1] := n; x[2] := n + 1; x[3] := 2 * n + 1;
        for i := 1 to 3 do
          if x[i] mod 2 = 0 then
            begin
              x[i] := x[i] div 2;
              Break;
            end;
        for i := 1 to 3 do
          if x[i] mod 3 = 0 then
            begin
              x[i] := x[i] div 3;
              Break;
            end;
        res := (x[1] mod m) * (x[2] mod m) * (x[3] mod m) mod m;
        WriteLn(fo, res);
      end;
  finally
    CloseFile(fi); CloseFile(fo);
  end;
end.

Do mình muốn các bạn đọc đề bài và nghĩ cách giải, sau đó mới xem lời giải của mình và tiếp đó là xem code nên có đặt tại nhiều trang và mình cũng tin các bạn sẽ không muốn đọc đề mà lại có lời giải ngay.

Trang 4 sẽ nói về một số điều và mở rộng về công thức trong bài của chúng ta: