¿Cómo imprimir todos los N dígitos (N es un número par) de un número Torn con una complejidad menor que O (N ^ 2)? ¿Qué algoritmo debo usar?

Eldric Liew señaló que solo hay tantos cuadrados perfectos de N dígitos. Eso es cierto, pero hay [math] O (\ sqrt {10} ^ N) [/ math] de ellos, por lo que eso no te ayudará en absoluto.

Supongamos que [math] K = N / 2 [/ math], [math] a, b [/ math] sean dos números de dígitos [math] K [/ math] (permitiendo ceros iniciales en [math] b [/ math ] solamente). Llamaremos a [math] (a, b) [/ math] un par roto si [math] n = 10 ^ K * a + b [/ math] (la concatenación de [math] a [/ math] y [math ] b [/ math]) es un número desgarrado.

Lo primero que noto es que [matemáticas] a = 10 ^ K-2 [/ matemáticas], [matemáticas] b = 1 [/ matemáticas] siempre funciona. Sin embargo, eso no es terriblemente útil a menos que solo necesite un número desgarrado.

salte al enfoque alternativo para una solución de trabajo mucho mejor.

Así es como comenzaría mi enfoque al tratar de evitar demasiada teoría de números.

[matemáticas] n = 10 ^ K * a + b = (a + b) ^ 2 [/ matemáticas]

Esto nos da una ecuación cuadrática.

Resolverlo (y tomar solo la solución positiva) produce

[matemáticas] b = \ frac {1-2a + \ sqrt {1 + 4 (10 ^ K-1) * a}} {2} [/ matemáticas]

La otra solución sería negativa, por lo que sabemos que cada [matemática] a [/ matemática] tiene como máximo una [matemática] b [/ matemática] con la que se puede combinar.

[math] b [/ math] debe ser un número entero, por lo que si [math] (a, b) [/ math] es un par, entonces

[matemáticas] 1 + 4 (10 ^ K-1) * a [/ matemáticas] es un cuadrado perfecto impar.

[matemática] 1 + 4 (10 ^ K-1) * a = (2m + 1) ^ 2 = 4m ^ 2 + 4m + 1 [/ matemática]

[matemática] (10 ^ K-1) * a = m (m + 1) [/ matemática] para algún número entero [matemática] m [/ matemática]

[matemática] 10 ^ K-1 [/ matemática] es [matemática] 99999… 9 [/ matemática] ([matemática] K [/ matemática] [matemática] 9 [/ matemática] s)

[matemáticas] 10 ^ K-1 = 3 ^ 2 * 111 … 11 = m * (m + 1) [/ matemáticas]

[matemática] 3 [/ matemática] no puede ser un factor de [matemática] m [/ matemática] y [matemática] m + 1 [/ matemática], entonces uno de los dos es divisible por [matemática] 9 [/ matemática] . También puede mostrar que [matemática] ([/ matemática] [matemática] 10 ^ K-1) / 9 \ equiv K \ mod 3 [/ matemática], pero eso solo ayuda en casos especiales.

Además, el lado derecho debe ser par y [matemáticas] 10 ^ K-1 [/ matemáticas] no lo es, así que [matemáticas] a [/ matemáticas] siempre debe ser par.

Por aquí empezamos a quedarnos sin vapor. Podríamos comenzar a trabajar con repunidades, pero eso puede ser un poco complicado.

Incluso con estas restricciones, hay una buena cantidad de verificación por hacer.

En cambio, ofrezco un enfoque alternativo :

Utiliza un poco de teoría de números, pero no está tan mal.

Una vez más, consideramos la ecuación

[matemáticas] 10 ^ K * a + b = (a + b) ^ 2 [/ matemáticas]

Pero esta vez lo consideramos [matemática] \ mod 10 ^ j [/ matemática] para [matemática] j = 1,2,3,…, K [/ matemática]

[matemáticas] \ mod (10 ^ K * a + b, 10 ^ j) \ equiv \ mod (b, 10 ^ j) [/ matemáticas]

[matemáticas] \ mod ((a + b) ^ 2,10 ^ j) \ equiv \ mod (a ^ 2,10 ^ j) + \ mod (2ab, 10 ^ j) + \ mod (b ^ 2,10 ^ j) [/ matemáticas]

Mirando [math] j = 1 [/ math], obtenemos (usando [math] c = \ mod (a, 10), d = \ mod (b, 10) [/ math]

[matemáticas] d = \ mod (c ^ 2 + 2cd + d ^ 2,10) [/ matemáticas]

Los únicos pares posibles [matemática] (c, d) [/ matemática] son

[matemáticas] (0,0), (0,1), (0,5), (0,6), (4,4), (4,9), (8,1), (8,4) , (8,9) [/ matemáticas]

¡Eso es solo 9 posibilidades, en lugar de 100!

Para comprender esto, necesitará aprender un poco sobre cómo resolver la aritmética cuadrática en modular. No es tan difícil como parece y puede hacer que una computadora lo haga fácilmente.

Luego usamos esa información para resolver el módulo [matemáticas] 100 [/ matemáticas] y luego [matemáticas] 10 ^ 3 [/ matemáticas], y [matemáticas] 10 ^ 4 [/ matemáticas], etc.

En [matemáticas] 10 ^ 4 [/ matemáticas], solo hay 37 posibilidades.

Haga esto hasta [matemática] 10 ^ K [/ matemática] y tendrá todas las soluciones posibles mucho más rápidamente que la verificación de fuerza bruta.

Sin embargo, no estoy exactamente seguro de cuál es el tiempo de ejecución, así que no puedo prometer nada.

Suponiendo “¿Cómo puedo imprimir todos los N dígitos (N es un número par) Números rotos con una complejidad menor que O (N ^ 2)” en lugar de “¿Cómo puedo imprimir todos los N dígitos (N es un número par) de un número rasgado ”

Editar: Conner Davis señaló que la pista no es muy útil. Calculé mal el número de cuadrados perfectos de N dígitos. Me abstendré de intentar problemas de PC cuando esté medio dormido (originalmente pensé que era un problema de tarea).


No voy a resolver su problema por usted, pero un buen comienzo es que un número desgarrado es un cuadrado perfecto. Solo hay tantos cuadrados perfectos de N dígitos …

Si realmente está atrapado, puede poner un comentario con sus ideas y dónde está atrapado.

More Interesting

Entrevista Street puzzle: ¿Pregunta de hormigas en la sección de matemáticas?

¿Qué tipo de algoritmo SLAM utiliza Teslas? ¿O incluso están usando algoritmos SLAM?

¿Los programadores realmente implementan los algoritmos, o usan los que se dan en las bibliotecas? (como usar HashMap en Java)

¿Qué problemas comunes se resuelven con la programación dinámica?

¿Debo aprender primero "el lenguaje de programación que elegí" o "algoritmo y estructura de datos"?

Estructuras de datos: ¿Cuál es una explicación intuitiva de los árboles rojo-negros?

¿Cómo funciona el algoritmo iPod shuffle?

¿Qué compañías necesitan algoritmos de flujo óptico fuertes?

Si tengo un buen conocimiento de Java, C ++, algoritmos y estructuras de datos y quiero ser un profesional independiente. ¿Cuánto puede ganar alguien con estas habilidades?

¿Para qué se usan realmente los algoritmos?

Con la complejidad de O (n) u O (1) u O (log n), ¿cómo encuentro cuándo se romperá una bola rompible cuando se lance desde un piso de un edificio que tiene más de 100 pisos?

¿Cuál es la mejor manera de crear una estructura de datos basada en valores clave en C ++ que admita memoria compartida entre procesos usando C ++ 11?

Lenguaje ensamblador: ¿Por qué las instrucciones INC y DEC no establecen la bandera de acarreo?

¿Qué libro debo elegir para estudiar la estructura de datos en lenguaje C?

¿Cuáles son los algoritmos posibles que se pueden usar para ordenar cada cubo en el algoritmo de clasificación de cubo?