0%

Codeforces Round 1083 (Div. 2)——CF-2205-B. Simons and Cakes for Success(如何求一个数全部素因子的乘积?)

题目大意

题目描述
给定一个整数 nn,要求找到最小的正整数 kk,使得 nn 能够整除 knk^n(即 nnknk^n 的因数)。
数据保证在给定范围内始终存在答案。

输入格式
第一行包含一个整数 tt1t1001 \le t \le 100),表示测试用例的数量。
接下来的 tt 行,每行包含一个整数 nn2n1092 \le n \le 10^9),表示题目给定的数值。

输出格式
对于每个测试用例,输出一行一个整数,表示满足条件的最小正整数 kk

样例输入

1
2
3
4
5
4
8
12
369
55635800

样例输出

1
2
3
4
2
6
123
2090

样例解释
在第一个测试用例中(n=8n = 8):
k=1k = 1 时,18=11^8 = 188 不是 11 的因数;
k=2k = 2 时,28=2562^8 = 25688256256 的因数(因为 256=8×32256 = 8 \times 32)。
因此,最小可能的 kk22

在第二个测试用例中(n=12n = 12):
最小的 kk66,因为 1212612=21767823366^{12} = 2176782336 的因数(因为 2176782336=12×1813985282176782336 = 12 \times 181398528)。

思路讲解

不难发现,答案就是 N 的所有素因子的乘积。

不过对于我来说,一个难点是怎么样求,就是N的所有素因子的乘积是多少。(在这道题目的数据范围限制下)

我们这里就用到了一个小trick,就是一个数啊,大于根号N的素因子,有的话只有一个。因此我们就不断的把小的素因子全部都给除掉,那么剩下的一个素因子就是最大的了。(而且这个大于根号N的素因子显然不可能被乘很多遍)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ll opN=N;
for (auto p1:primes) {
if (p1*p1>N) {
break;
}
if (opN%p1==0) {
res*=p1;
while (opN%p1==0) {
opN/=p1;
}
}
}
res*=opN;
cout<<res<<"\n";

AC代码

AC

https://codeforces.com/contest/2205/submission/364837938

心路历程(WA,TLE,MLE……)