voiddivide(int x) { for (int i = 2; i <= x / i; i ++ ) if (x % i == 0) { int s = 0; while (x % i == 0) x /= i,s ++ ; cout << i << ' ' << s << endl; } if (x > 1) cout << x << ' ' << 1 << endl; cout << endl; }
intmain() { int n; cin >> n; while (n -- ) { int x; cin >> x; divide(x); } return0; }
// a / b = a * x(mod p) a / b = a * b ^ -1 p是质数 // b * x = 1 (mod p) 求b * b ^ -1 = 1(mod p) // 那么 x叫做 b 的 乘法逆元 // 费马定理 b^(p - 1) = 1(mod p) b * b^(p - 2) = 1(mod p);这时候直接求b^(p - 2)即可 // 那么 b ^ -1 = b^(p - 2) b * b^(p - 2) = 1(mod p) --->b ^ -1 = b^(p - 2)(mod p)
#include<bits/stdc++.h>
usingnamespace std;
typedeflonglong LL;
LL qmi(int a, int b, int p) { LL res = 1; while (b) { if (b & 1) res = res * a % p; a = a * (LL)a % p; b >>= 1; } return res; }
intmain() { int n; scanf("%d", &n); while (n -- ) { int a, p; scanf("%d%d", &a, &p); if (a % p == 0) puts("impossible"); elseprintf("%lld\n", qmi(a, p - 2, p)); } return0; }
// 根据费马定理,任意正整数a, b都存在x, y使得ax + by = gcd(a, b) intexgcd(int a,int b, int &x, int &y) { if (!b) // 如果b = 0, 则gcd(a, b) = 1 * a + 0 * b { x = 1, y = 0; return a; } int d = exgcd(b, a % b, y, x); y -= a / b * x; return d; }
intmain() { int n; scanf("%d", &n); while (n -- ) { int a, b; scanf("%d%d", &a, &b); int x, y; exgcd(a, b, x, y); printf("%d %d\n", x, y); } return0; }
证明
AcWing 878. 线性同余方程
1 2 3 4 5 6 7 8
a * x ≡ b(mod m) 这个公式的意思(a * x) % m = b
a * x = m * y + b ---> a * x - m * y = b 令 y' = -y ----> a * x + m * y' = b 这里就是扩展欧几里得算法一样了 ,两边同时乘以 d / b 倍得到 a * x * d / b + m * y' * d / b = d 令 x0 = x * d / b, y0 后面x ≡ x0 * (b / d) (mod m)
intexgcd(int a, int b, int &x, int &y) { if (!b) { x = 1, y = 0; return a; } int d = exgcd(b, a % b, y, x); y -= a / b * x; return d; }
intmain() { int n; scanf("%d", &n); while (n -- ) { int a, b, m; scanf("%d%d%d", &a, &b, &m); int x, y; int d = exgcd(a, m, x, y); if (b % d) puts("impossible"); elseprintf("%d\n", (LL)b / d * x % m); } return0; }
AcWing 204. 表达整数的奇怪方式 (中国剩余定理)
x ≡ m1 (mod a1) 这个就是说x和m1对a1取模,结果是一样的,所以可以用a1和m1来表示x
—> x = k1 * a1 + m1
我们要求解如下形式的线性同余方程组
1 2 3 4 5 6 7 8 9 10 11 12 13
x ≡ m₁ (mod a₁) x = k1 * a1 + m1 x ≡ m₂ (mod a₂) x = k2 * a2 + m2 ... x ≡ mₙ (mod aₙ) x = kn * an + mn
===> k1 + k * a2 / d k2 + k * a2 / d 这就是方程的所有解 x = k1 * a1 + m1 = (k1 + k * a2 / d) * a1 + m1 = a1*k1+m1+k[a1,a2] = x0 + k * a ==> x mod a ≡ x0 ===> x0 mod a