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;
}