about summary refs log tree commit diff
path: root/THT/B/QG-2016/remainder.py
diff options
context:
space:
mode:
Diffstat (limited to 'THT/B/QG-2016/remainder.py')
-rwxr-xr-x[-rw-r--r--]THT/B/QG-2016/remainder.py57
1 files changed, 41 insertions, 16 deletions
diff --git a/THT/B/QG-2016/remainder.py b/THT/B/QG-2016/remainder.py
index 45681ca..2c4de2d 100644..100755
--- a/THT/B/QG-2016/remainder.py
+++ b/THT/B/QG-2016/remainder.py
@@ -1,19 +1,44 @@
 #!/usr/bin/env python3
 
-l = [
-        (12, 3, 8),
-        (2, 15, 17),
-        (456, 6, 1296),
-        (1234, 100, 9),
-        (11223344, 1000000, 142857),
-        (55667788, 10000000, 1000000007),
-        (1357, 24682468, 999999999),
-        (24680, 1357913579, 777777777),
-        (998, 1000000000000, 999),
-        (1234, 11111111111111, 30),
-        (1, 222222222222222, 123456789),
-        (2016, 666666666666666, 8888888888),
-        (11223344, 555666777888999, 1357924680),
-        (999999999999999967, 999999999999999877, 999999999999999989),
-        (123456789123456789, 123456789123456789, 987654321123456789)
+TESTS = [
+    [12, 3, 8],
+    [2, 15, 17],
+    [456, 6, 1296],
+    [1234, 100, 9],
+    [11223344, 1000000, 142857],
+    [55667788, 10000000, 1000000007],
+    [1357, 24682468, 999999999],
+    [24680, 1357913579, 777777777],
+    [998, 1000000000000, 999],
+    [1234, 11111111111111, 30],
+    [1, 222222222222222, 123456789],
+    [2016, 666666666666666, 8888888888],
+    [11223344, 555666777888999, 1357924680],
+    [999999999999999967, 999999999999999877, 999999999999999989],
+    [123456789123456789, 123456789123456789, 987654321123456789]
 ]
+
+
+def powmod(a, n, m):
+    if n == 1:
+        return a % m
+
+    if n % 2:
+        return powmod(a, n // 2, m) ** 2 * a % m
+
+    return powmod(a, n // 2, m) ** 2 % m
+
+
+# Gọi l là "chiều dài" của x, l = int(log10(x) + 1) hay l = len(str(x))
+# Đặt l ** 10 = a, dễ thấy y = x * (a**(n-1) + a**(n-2) + ... + a + 1)
+#                            = x * (a**n - 1) / (a - 1)
+# y chia m bằng k dư q hay x * (a**n - 1) / (a - 1) = k * m + q
+#                      <=> x * (a**n - 1) = k * (a*m - a) + q * (a - 1)
+#                      <=> q = x * (a**n - 1) % (a*m - a) / (a - 1)
+
+with open('REMAINDER.TXT', 'w') as f:
+    for case in TESTS:
+        a = 10 ** len(str(case[0]))
+        case[2] *= a - 1
+        p = powmod(a, case[1], case[2])
+        f.write(str(case[0] * (p - 1) % case[2] // (a - 1)) + '\n')