Un gran número de módulo prefijo sufijo molde de matriz

Formación 1 - G título

Polycarpus participa en un concurso para la piratería en un nuevo mensajero seguro. Él está a punto de ganar.
Después de haber estudiado cuidadosamente el protocolo de interacción, Polycarpus llegó a la conclusión de que la clave secreta se puede obtener si se corta correctamente la clave pública de la solicitud en dos partes. La clave pública es un entero largo que puede consistir incluso un millón de dígitos!
Polycarpus necesidades para encontrar una manera de cortar la clave pública en dos partes no vacíos, que la primera (a la izquierda) es divisible por parte de un como un número separado, y la segunda parte (derecha) es divisible por b como un número separado. Ambas partes deben ser números enteros positivos que tienen ceros sin líderes. Polycarpus sabe los valores de a y b.
Ayuda Polycarpus y encontrar cualquier método adecuado para cortar la clave pública.

Entrada

La primera línea de la entrada contiene la clave pública del mensajero - un número entero sin ceros a la izquierda, su longitud está en el rango de 1 a 106 dígitos. La segunda línea contiene un par de enteros separados por espacios positivos a, b (1 ≤ a, b ≤ 108).

Salida

En la primera línea de impresión “SÍ” (sin las comillas), si el método que satisface las condiciones anteriormente existe. En este caso, al lado de impresión de dos líneas - las partes izquierda y derecha después del corte. Estas dos partes, siendo concatena, deben ser exactamente idéntica a la clave pública. La parte izquierda debe ser divisible por una, y la parte derecha debe ser divisible por b. Las dos partes deben ser enteros positivos que no tienen ceros a la izquierda. Si hay varias respuestas, imprimir cualquiera de ellos.
Si no hay respuesta, imprimir en una sola línea “NO” (sin las comillas).

Ejemplos

Entrada

116401024
97 1024

Salida

SI
11640
1024

Entrada

284254589153928171911281811000
1009 1000

Salida


2842545891539
28171911281811000

Entrada

120
12 1

Salida

NO

#pragma warning (disable:4996)
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <vector>
#include <stack>
#define inf 0X3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e6 + 5;
const int M = 10;//状压

string str;
ll a, b;
int v[maxn];
int index;
ll tmp;
bool flag;

int main()
{
	cin >> str;
	scanf("%lld%lld", &a, &b);
	tmp = 0;
	flag = 0;
	for (int i = 0; i < str.length(); i++)
	{
		tmp = (tmp * M + (ll)(str[i] - '0')) % a;
		if (tmp == 0 && str[i + 1] != '0')
			v[i] = 1;
	}
	tmp = 0;
	int in = 1;
	flag = 0;
	for (int i = str.length() - 1; i >= 0; i--)
	{
		tmp = (tmp + in * (str[i] - '0')) % b;
		in = (in * 10) % b;
		if (tmp == 0 && v[i - 1] == 1)
		{
			index = i;
			break;
		}
	}
	if (index == 0)
		printf("NO\n");
	else
	{
		printf("YES\n");
		for (int i = 0; i < str.length(); i++)
		{
			if (i == index)
				printf("\n");
			printf("%d", str[i] - '0');
		}
		printf("\n");
	}
	return 0;
}

Ideas:
de adelante hacia atrás de un divisibles encontrar un lugar, encontrar divisible por b posiciones de la parte posterior, si las dos posiciones coinciden, y sin ceros a la izquierda es la respuesta.
propiedades de módulo Analizando obtuvieron con 0 para determinar, si una operación de módulo cuando el divisible: (a + b)% n == un% n + b% n.

Publicado 28 artículos originales · ganado elogios 0 · Vistas 336

Supongo que te gusta

Origin blog.csdn.net/xukeke12138/article/details/104626547
Recomendado
Clasificación