canuc80k0835·36/50

Lũy Thừa Hai Tầng

Nộp bài trên LQDOJ

Bài 08 · Arithmetic

Cho bộ ba số nguyên không âm . Với mỗi bộ, hãy tính

Trong bài này, mọi biểu thức đều được quy ước bằng . Quy ước này áp dụng cả khi tính lẫn lũy thừa bên ngoài.

Input

  • Dòng đầu chứa số nguyên .
  • Mỗi trong dòng tiếp theo chứa ba số nguyên .

Output

  • Với mỗi bộ dữ liệu, in kết quả trên một dòng.

Constraints

  • .
  • .

Scoring

  • Subtask ( số điểm): và .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

5
2 3 2
5 0 7
0 0 0
0 2 3
7 10 0

Output

512
1
0
0
7

Giải thích: Bộ đầu cho . Ở bộ thứ hai, nên lũy thừa ngoài có số mũ ; ở bộ thứ ba, ở tầng trong nên kết quả là . Hai bộ còn lại lần lượt là và .

Lời giải tóm tắt
  • Phân tích: Đặt P=1,000,000,007. Khi số mũ E=b^c dương và a không chia hết cho P, định lý Fermat nhỏ cho phép thay E bằng E mod (P-1). Giá trị này được tính bằng lũy thừa nhị phân modulo P-1.
  • Phân tích: Cần tách các trường hợp không nguyên tố cùng nhau với P. Do 0≤a≤10^9<P, chỉ có a=0 cần chú ý. Số mũ b^c bằng 0 đúng khi b=0,c>0; khi đó kết quả là a^0=1. Trong mọi trường hợp còn lại, số mũ dương; nếu a=0 thì kết quả bằng 0.
  • Thuật toán: Với mỗi bộ (a,b,c):
  • Thuật toán: 1. Nếu b=0,c>0, in 1. 2. Nếu a=0, in 0. 3. Tính e=b^c mod (P-1) bằng binary exponentiation. 4. In a^e mod P.
  • Chứng minh đúng: Nhánh đầu nhận đúng và chỉ đúng trường hợp số mũ ngoài bằng 0, nên quy ước a^0=1 được áp dụng chính xác. Sau khi bỏ nhánh đó, số mũ dương; nhánh a=0 cho đúng 0. Ở nhánh còn lại, gcd(a,P)=1; Fermat bảo đảm giảm số mũ modulo P-1 không đổi phần dư. Hai lần lũy thừa nhị phân tính đúng các phần dư cần thiết, nên thuật toán đúng cho mọi bộ.
  • Độ phức tạp: Mỗi bộ cần O(log c + log P) thời gian và O(1) bộ nhớ phụ.