trang chủ / đề bài / congeq / lời giải

Phương trình đồng dư

Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Tác giả: huunguyenhuunguyen

Hướng tiếp cận

Sử dụng định lý Fermat nhỏ và định lý số dư Trung Hoa (CRT) để rút gọn bài toán về một số O(p) trường hợp dư rồi đếm theo công thức cấp số cộng.

Nhận xét quan trọng

  1. Tuần hoàn của an: gcd(a,p)=1 nên ap−1≡1(modp). Suy ra an(modp) chỉ phụ thuộc i=nmod(p−1).
  2. Phương trình modulo p: cố định i. Khi đó ai là hằng số khả nghịch, nên n≡b·(ai)−1(modp). Đặt j=b·a−imodp.
  3. CRT: với mỗi i∈{0,1,…,p−2}, hệ:
    • n≡i(modp−1)
    • n≡j(modp) có duy nhất một nghiệm n0∈[0,p(p−1)). Lý do duy nhất: gcd(p−1,p)=1.

Thuật toán

  1. Tiền tính aimodp cho i=0,…,p−2. Nghịch đảo của ai là ap−1−i.
  2. Đặt g=p(p−1). Với mỗi i:
    • Tính j=b·a−imodp.
    • Tìm k=(i−j)modp (vì p−1≡−1(modp)).
    • Đặt n0=i+(p−1)·k. Nếu n0=0 thì lấy n0=g (vì n≥1).
    • Nếu n0≤x, cộng ⌊(x−n0)/g⌋+1 vào đáp án.
  3. In tổng.

Độ phức tạp

  • Thời gian: O(p).
  • Bộ nhớ: O(p) cho bảng luỹ thừa.

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0