Codeforces 1327E - contar los bloques

El significado de los problemas

Dado un número n

Descripción tiene entre 0 y 9999 ... (n número 9) 10 ^ n dígitos

Si todos los números es menor que n bits, todos los ceros a la izquierda se rellenan con el fin de garantizar que cada número es el número de bits n

Cada número está entonces definida por una pluralidad de bloques

El mismo número de bloques adyacentes que constituyen una

Por ejemplo, para 00027734000

Hay tres bloques de longitud 1 (2,3,4)

Una longitud de bloque 2 (77)

2 bloques de longitud 3 (000,000)

Pregunta, 10 ^ n n-bit número, la suma de las longitudes de bloques de diferentes número total de




entrada

Un número n

1 <= n <= 2E5




exportación

n dígitos, separados por un espacio

El i-ésimo bloque i indica la longitud del número de

La respuesta a la modulo 998 244 353




Ideas de resolución de problemas

No sé no hay ninguna fórmula Gangster directa lanzamiento

Aquí estamos hablando acerca del método recursivo


Supongamos ahora que n es 1, es decir, sólo el número de 0 a 9 de estos 10

Así que si por cada cargo más uno, por lo que se convierte en 2 dígitos 1 dígitos

Se puede obtener, de la longitud del bloque 2 se aplica solamente por la longitud de un bloque siguiente que decir un número obtuvo

Por lo tanto, 2 bits, la longitud es de 10 tipos de bloques es 2, 00,11,22 ... 99

Y una longitud de varios bloques, es decir, el número de todos los bits de los restantes

Es decir, todos los bits dígitos y 2 (cada número 2) * 100 (especies) = 200

Bloques de longitud 2 ocupa los 2 (bit) * 10 (especies) = 20

Por lo tanto, la longitud del bloque 1 son 200--20 = 180 tipos


Del mismo modo, el número de bits 2 y 3 de dígitos Recursive

3 es la longitud de bloque sólo por la longitud de un bloque siguiente, más 2 para dar los mismos números

Por lo tanto, el número de tipos de longitud de bloque 3 a 10

2 es una longitud de bloque sólo por la longitud de un siguiente bloque del mismo número más 1 para dar

nota:

Bloquear no es un bloque de la misma longitud de la transición de estado de retención de

Porque si desea transferir desde el bloque de la misma longitud de, a continuación, transferir los números adicionales no se pueden añadir en el siguiente bloque .

Sin embargo, no añaden el siguiente bloque, se puede obtener digitales transferidos desde el otro estado, lo que resulta en la duplicación

Por ejemplo, 12223 es de 222 bloques de longitud 3

Para mantener la longitud del bloque, los números adicionales no se pueden añadir a aproximadamente 222

Para más adelante agregar 1 como ejemplo, se convertirá 122231

Sin embargo, este número puede añadir 2 12231 transfiere desde el bloque 22

Esto causará que las estadísticas duplicados, sólo puede bloquear a una transferencia longitud más larga

Por lo tanto, el número de tipos de longitud de bloque 2 180

Hay tres dígitos 3 * 1000 = 3000

Por lo que la longitud del tipo de bloque número 1 es 3000--180 * 2--10 * 3 = 2610 tipos de


Y así sucesivamente hasta que el empuje necesario para n dígitos de

1 se pueden encontrar en todos los bits y el número de bits de 10,2 número dígitos para todos y para todos los bits y 200, número de 3 dígitos es 3000 ......

El número de todos los bits y i es i * (10 ^ i)

La mediana i es el número de bloques de una fórmula recursiva es

i * (10 ^ i) - 2 (el número de bloques de longitud 2) --3 (el número de bloques de longitud 3) - ... - n (n es el número de bloques de longitud)




la implementación del código

La longitud de cada número de bloque de almacenamiento junto con un ans de matriz, tipo de uso a largo largo

circunstancias de dos dígitos sólo se puede llegar a romper

ans[1]=10;
ans[2]=180;

A continuación, el ciclo comienza de 3 a necesidades de N de la matriz ans

Pero si realmente tiene que ir paso a paso para contar el número de bits por encima de fórmula recursiva * y el número de palabras

complejidad tiempo será O nivel (n ^ 2), para la gama de tiempo de espera 1E5

Así que la manera de pensar sobre (loco buscando extraño conocimiento de la escuela secundaria)


De acuerdo con la mencionada anteriormente, cada uno de dos o más bloques son de bajo adición de un número de bloque transferido de una y la misma

Así que hay un total más cifra es la suma de una serie de casos estatales

La longitud es el número del estado actual del bloque 1 puede estar formada en ** (longitud de bits del número de todos los números de i) - (número de bits de longitud de todos los números de i-1) - (i-1 cuando la longitud de la suma del número de todos los bloques) para dar **

Además de una suma de la matriz de memoria de variables ans prefijo y se puede realizar O (n) solución de


Para el * i (10 ^ i), todos de 10 ^ i se puede pretratar array presencia llamada fácil

También se puede combinar directamente con el poder rápida

La siguiente es una manera de mantener la matriz, la matriz nombrar e10

Así que ahora ans [i] es la ecuación de transición i * e10 [i] - (i-1) * e10 [i-1] - suma

Y debido a que los datos son demasiado grandes necesidades modulo

Suponiendo e10 [i] es muy pequeña, e10 [i-1] y la suma es grande, entonces el fin de garantizar puede llegar a ser positivo después de módulo

Así que de nuevo, más i-mod

La última expresión es

ans[i]=(i*e10[i]-(i-1)*e10[i-1]-sum+i*mod)%mod;

Para el prefijo y la suma

En seguida de una

sum=(sum+ans[i])%mod;

para

Finalmente ans matriz en orden inverso de salida




El código completo

(78ms / 2000ms)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
ll ans[200050],e10[200050];
int main(){
	int n,i;
	scanf("%d",&n);
	e10[0]=1;
	for(i=1;i<=n;i++)
		e10[i]=e10[i-1]*10%mod;
	ll sum=190;
	ans[1]=10;
	ans[2]=180;
	for(i=3;i<=n;i++)
	{
		ans[i]=(i*e10[i]-(i-1)*e10[i-1]-sum+i*mod)%mod;
		sum=(sum+ans[i])%mod;
	}
	for(i=n;i;i--)
		printf("%d ",ans[i]);
	
	return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/stelayuri/p/12556495.html
Recomendado
Clasificación