算数基本定理
算数基本定理
定理
对于整数 \(a > 1\),必有 \(a=p_1^{a_1}p_2^{a_2}\dots p_s^{a_s}\),其中 \(p_j(1\leq j\leq s)\) 是两两不相等的质数,\(a_j(1\leq j\leq s)\) 表示对应质数的幂次。在不计次序的意义下,该分解式是唯一的。
运用于质因数分解:
int Decomposition(int x, int a[])
{
int cnt = 0;
for (int i = 2; i <= x / i; i++)
{
for (; x % i ==0; x /= i)
{
a[++cnt] = i;
}
}
if (x > 1) a[++cnt] = x;
return cnt;
}
推论
-
\(d\) 是 \(a\) 的约数的充要条件是 \(d=p_1^{e_1}p_2^{e_2}\dots p_s^{e_s},0\leq e_j \leq a_j,1\leq j \leq s\),即 \(d\) 中每个质数的幂次都不超过 \(a\) 中每个质数的幂次。
- 每个质因子上的幂次直接决定了两数之间的整除性。
- \(12=2^2\times 3,72=2^3\times 3^2\),看到 \(12\) 的质因子上的每个幂次都对应地比 \(72\) 小,便可以在进行取模运算的情况下给出 \(12|72\) 的结论。
-
若 \(b=p_1^{e_1}p_2^{e_2}\dots p_s^{e_s}\),(这里允许某些 \(a_j\) 或 \(e_j\) 为零),那么 \((a,b) = p_1^{d_1}p_2^{d_2}\dots p_s^{d_s},d_j = \min(a_j,e_j),1\leq j \leq s\),以及\([a,b] = p_1^{y_1}p_2^{y_2}\dots p_s^{y_s},y_j = \min(a_j,e_j),1\leq j \leq s\)
-
\(10 = 2\times 5,16 = 2 ^ 4\)
-
\((10,16) = 2^{\min(1,4)} \times 5^{\min(1,0)} = 2^1 \times 5^0 = 2\)
-
\([10,16] = 2^{\max(1,4)} \times 5^{\max(1,0)} = 2^4 \times 5^1 = 80\)
-
\[(10,16)[10,16] = 2^{\min(1,4)} \times 5^{\min(1,0)}\times 2^{\max(1,4)} \times 5^{\max(1,0)} \\= 2^{\min(1,4) + \max(1,4)} \times 5^{\min(1,0) + \max(1,0)} \\= 2^{1 + 4} * 5^{1 + 0} \\10 \times 16 = 2 \times 5 \times 2^0 = 2 ^{1 + 4} \times 5^{1+0} \]
-
这刚好证明了 \([a_1,a_2](a_1,a_2) = a_1a_2\),本质上是 \(\min(a,b) + \max(a,b) = a + b\)。
-
-
-
用除数函数 \(r(a)\) 表示 \(a\) 的所有正约数的个数,则 \(r(a) = (a_1 + 1)(a_2+1)\dots (a_s+1) = r(p_1^{a_1})\dots r(p_1^{a_s})\)
- 即推论1.的推论,对于每个质因子上的幂次,可以取 \(0\) 到 \(a_i\) 中的任意整数,共有 \(a_i + 1\) 个。由乘法原理可以直接得出。
- 如 \(a=2^7 \times 3^8\times 5^9\),可以直接写出 \(a\) 的因子个数 \((7 + 1)(8 + 1)(9 + 1) = 720\)
- 第二个等号展现了质因子的“独立性”。
-
用除数和函数 \(o(a)\) 表示 \(a\) 的所有正约数的和,则 \(o(a) = \frac {p_1^{a_1 + 1} - 1} {p_1 - 1}\dots \frac {p_1^{a_s + 1} - 1} {p_1 - 1} = o(p_1^{a_1})\dots o(p_1^{a_s})\)。
-
亦为推论1.的推论,对于 \(a=120=2^3\times 3\times 5\) 的因子分别是 \(1,2,3,4,5,6,8,10,12,15,20,24,30,40,60,120\)。
-
然后用等比数列求和公式(\(\frac {p_1^{a_1 + 1} - 1}{p_1 - 1} = 1 + p_1 + \dots + p_1^{a_1}\))展开那个算式。
\(o(120) = \frac {2^4 -1}{2-1} \frac {3^2 -1}{3-1} \frac {5^2 -1}{5-1} = (2^3 + 2^2 + 2^1 + 1)(3^1 + 1)(5^1+1)\)
最后再展开括号,即为所有因数。
-
例题
即对推论一的应用。
由推论一可得,当 \(m_1^{m_2}\) 中每个质因子的幂次都比 \(S_i^{x_i}\) 小时,\(m_1^{m_2}|S_i^{x_i}\) 成立。 \(S_i^{x_i}\) 中的质因子是否出现由 \(S_i\) 决定,而质因子出现了几次主要由 \(x_i\) 决定。若 \(S_i = p_1^{e_1}p_2^{e_2}\dots p_s^{e_s}p_{s+1}^{e_{s+1}}\dots p_{s+r}^{e_{s+r}}\)(\(p_{s+1}\) 到 \(p_{s+r}\) 表示与 \(m_1\) 无关的质因子),那么 \(x_i\) 应该使得对于所有的 \(i\leq j\leq s\) 的 \(j\),满足 \(a_jm_2 \leq e_jx_i\)。
所以从 \(m_1\) 中的质因子 \(p_j\) 出发:
- 如果这个 \(s_i\) 不能整除 \(p_j\),则说明 \(s_i\) 不包含这个质因子,进而说明不符合题目要求
- 如果这个 \(s_i\) 能整除 \(p_j\),那么只要求出对应的 \(e_j\),就能算出第 \(j\) 个质因子,要求 \(x_i\) 不小于 \(\left \lceil \frac{a_jm_2}{e_j} \right \rceil\),再对所有这样的要求取最大值,就得到了 \(x_i\),最后对所有合法的 \(x_i\) 取最小值就是答案。
#include <bits/stdc++.h>
#define maxn 10010
int m1, m2, n, pri[maxn], tot[maxn], a[maxn];
int Decomposition(int x)
{
int cnt = 0, Cnt = 0;
for (int i = 2; i * i <= x; i++)
{
for (; x % i == 0; x /= i)
{
a[++cnt] = i;
}
}
if (x > 1)
a[++cnt] = x;
for (int i = 1; i <= cnt; i++, tot[Cnt]++)//tot记录对应质数的次数
{
if (a[i] != a[i - 1])
pri[++Cnt] = a[i];//pri记录m1中出现的质数
}
return Cnt;
}
int main()
{
std::cin >> n >> m1 >> m2;
int cnt = Decomposition(m1), ans = 2e9, s;
while (n--)
{
std::cin >> s;
int x = 0;
for (int i = 1; i <= cnt; i++)
{
int p = pri[i];
if (s % p != 0)
{
x = -1;
break;
}
else
{
int e = 0;
for (; s % p == 0; s /= p)
e++;
x = std::max(x, 1 + (m2 * tot[i] - 1) / e);
}
}
if (x >= 0)
ans = std::min(ans, x);
}
if (ans >= 2e9)
{
puts("-1");
}
else
{
printf("%d", ans);
}
}