Pregunta H
Enumeración violenta, TLE, después de 7 ejemplos, probablemente pueda obtener una puntuación de 50% ~ 70%.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
for (long i = 1; i <= n; i++) {
// 将这个数开根号之后转为整形 砍掉后面的小数位 判断是否等于这个数字
if ((long) Math.sqrt(i * n) * (long) Math.sqrt(i * n) == i * n) {
System.out.println(i);
return;
}
}
}
}
Solución correcta : De hecho, el punto de prueba de esta pregunta es descomponer los factores primos, n ⋅ x = m 2 n x=m^2norte ⋅X=metro2 ,no¿Cuál es la mínima multiplicación de n , que puede hacernnEl número de factores primos en n se vuelve par; n
= P 1 α 1 × P 2 α 2 × . . . × P n α nn=P_1^{α1}×P_2^{α2}×...×P_n^{ n}norte=PAG1α 1×PAG2α 2×. . .×PAGnorteun _, si el grado de un factor primo α i α_iunyoes un número impar, entonces multiplicamos por al menos este factor primo, así que este problema es poner nnDescomponga los factores primos de n , mire los grados de todos sus términos, multiplique todos los factores primos con grados impares, y esa es la respuesta.
时间复杂度
O( norte ) O(\sqrt N)O (norte)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
long res = 1;
for (long i = 2; i * i <= n; i++) {
if (n % i == 0) {
int s = 0;
while (n % i == 0) {
// 分解质因子求次数
s++;
n /= i;
}
if (s % 2 == 1) res *= i; // 如果是奇数 则乘起来
}
}
if (n > 1) res *= n; // 表示还有一个质因子 次数是1
System.out.print(res);
}
}
Para n > 1 n > 1norte>1 Por ejemplo,24 = 2 3 × 3 24 = 2^3×32 4=23×3 , en este momento nuestrores = 2 res=2r e s=2 , pero también hay un factor de3 33 no se cuenta, porque estamoswhile(n % i == 0)
en el último paso del códigon /= i = 3
, el último factor se deja sin considerar, y el número es 1, por lo que finalmente se multiplica pornnn es suficiente,res = 2 × 3 = 6 res = 2 × 3=6r e s=2×3=6 _