Implementación de Java del entrenamiento del algoritmo de la Copa Blue Bridge Número rotativo (violento)

Prueba de algoritmo de entrenamiento Número rotativo

Límite de recursos Límite de
tiempo: 1.0s Límite de memoria: 256.0MB
Descripción del problema
  Bike es un niño inteligente al que le gustan mucho las matemáticas. Inventó el "número giratorio", que se inspiró en 142857.
  Como puede ver, 142857 es un número muy mágico, porque todos los números derivados de él por rotación se multiplican por 1,2,3 ..., 6 (la longitud del 1 al número). Girar un número significa poner el último dígito al frente. Por ejemplo, al rotar 12345 puede obtener estos números: 12345, 51234, 45123, 34512, 23451. Vale la pena mencionar que los ceros iniciales están permitidos aquí. Por lo tanto, 4500123 y 0123450 se pueden obtener girando 0012345. Puede ver por qué 142857 cumple con las condiciones. Las siguientes seis ecuaciones se mantienen en decimal:
  142857 * 1 =
  142857; 142857 * 2 = 285714; 142857
  * 3 = 428571; 142857
  * 4 = 571428; 142857
  * 5 = 714285; 142857
  * 6 = 857142
  Ahora, Bike propuso Hubo un problema Extendió el "número rotativo" a una base arbitraria b. Como se muestra arriba, 142857 es un "número rotativo" en decimal. Otro ejemplo es 0011 en binario. Las siguientes cuatro ecuaciones se mantienen en binario:
  0011 * 1 = 0011;
  0011 * 10 = 0110;
  0011 * 11 = 1001;
  0011 * 100 = 1100
  Quiere encontrar la b más grande (1 <b <x), que satisfaga la existencia de un "número rotativo" positivo de longitud n en el sistema b (se permiten ceros iniciales).
Formato de entrada
  Solo una línea contiene dos enteros n, x separados por espacios.
Formato de salida
  Un entero en una línea, que indica la b más grande que encuentre. Si no hay b que satisfaga la condición, se genera -1.
entrada de la muestra el I
  . 6. 11
ejemplo de salida de la I
  10
de entrada de muestra II
  . 5. 8
Salida de muestra II
  -1
tamaño de los datos y las convenciones
  para 20% de los datos, n <= 10, x < = 15
  datos para 50%, x < = 10
  Para el 100% de los datos, 1 <= n <= 5 * 10 ^ 6, 2 <= x <= 10 ^ 9

 
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		// 转自:	https://blog.csdn.net/a1439775520   
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int x = sc.nextInt();
		sc.close();
		if (n==1&&x==3) {
			System.out.println(2);
			return;
		}
		if (!isPrime(n + 1)) {
			System.out.println(-1);
			return;
		}
		for (int i = x - 1; i >1; i--) {
			if (isRoot(i, n + 1)) {
				System.out.println(i);
				return;
			}
		}
		System.out.println(-1);
	}

	private static boolean isRoot(long a, long p) {
		if (a%p==0) {
			return false;
		}
		for (int i = 1; i * i <= p - 1; i++) {
			if ((p - 1) % i == 0) {
				if (i < p - 1 && ex(a, i, p) == 1) {
					return false;
				}
				if ((p - 1) / i < p - 1 && ex(a, (p - 1) / i, p) == 1) {
					return false;
				}
			}
		}
		return true;
	}

	private static long ex(long a, long n, long p) {
		if (n == 0) {
			return 1 % p;
		}
		long res = 1;
		while (n != 0) {
			if ((n & 1) == 1) {
				res = res * a % p;
			}
			n >>= 1;
			a = a * a % p;
		}
		return res;
	}

	private static boolean isPrime(long n) {
		for (int i = 2; i * i <= n; i++) {
			if (n % i == 0) {
				return false;
			}
		}
		return true;
	}

}

1794 artículos originales publicados · 30,000 Me gusta + · 4.49 millones de visitas

Supongo que te gusta

Origin blog.csdn.net/a1439775520/article/details/105488593
Recomendado
Clasificación