Let’s consider K-based numbers, containing exactly N digits. We define a number to be valid if its K-based notation doesn’t contain two successive zeros. For example:
1010230 is a valid 7-digit number;
1000198 is not a valid number;
0001235 is not a 7-digit number, it is a 4-digit number.
Given two numbers N and K, you are to calculate an amount of valid K based numbers, containing N digits.
You may assume that 2 ≤ K ≤ 10; N ≥ 2; N + K ≤ 18.
Input
The numbers N and K in decimal notation separated by the line break.
Output
The result in decimal notation.
Sample
Input
2
10
Output
90
http://acm.timus.ru/problem.aspx?space=1&num=1009
Solucion: * Caso k = 2, y se permiten ceros al inicio: Definimos F( n ) como la cantidad de numeros binarios de n digitos tal que ninguno de esos numeros contenga 2 ceros consecutivos. Por ejemplo F( 3 ) = 5 { 010, 011, 101, 110, 111 } Podemos definir F de manera recursiva: * Cuando n = 1, F( 1 ) = 2 * Cuando n = 2, F( 2 ) = 3 * Cuando n >= 3, Existen dos posibilidades: * Caso 1: El primer digito es 1, y los siguientes n-1 digitos forman un numero binario sin 2 ceros consecuitvos: F( n - 1 ) * Caso 2: El primer digito es 0, el segundo es 1, y los siguientes n-2 digitos forman un numero binario sin 2 ceros consecutivos: F( n - 2 ) Por tanto F( n ) = F( n - 1 ) + F( n - 2 ) * Caso k arbitrario, y se permiten ceros al inicio: Aplicando un analisis similar al anterior, definimos F( n, k ) como la cantidad de numeros en base k de n digitos tal que ninguno de esos numeros contenga 2 ceros consecutivos. * Cuando n = 1, F( 1, k ) = k * Cuando n = 2, F( 2, k ) = k * k - 1 * Cuando n >= 3, F( n, k ) = ( k-1 ) * F( n-1, k ) + ( k-1 ) * F( n-2, k ) * Caso k arbitrario, sin ceros al inicio ( lo que pide el problema ): Esta cantidad que estamos buscando es igual a todos los numeros cuyo primer digito es 1 o 2 o 3 o ... o 9, y cuyos n-1 siguientes digitos sean numeros en base k que no contengan ceros consecutivos. Cant. Numeros validos = ( k - 1 ) * F( n - 1 )
import java.io.BufferedReader; import java.io.InputStreamReader; public class Problema1009 { public static void main( String[] args ) throws Exception { BufferedReader br = new BufferedReader( new InputStreamReader( System.in ) ); int N = Integer.parseInt( br.readLine() ); int K = Integer.parseInt( br.readLine() ); int numPosibles = ( K - 1 ) * F( N - 1, K ); System.out.println( numPosibles ); } public static int F( int N, int K ) { // Casos Bases if( N == 1 ) return K; if( N == 2 ) return K * K - 1; // Calculamos previamente los casos iniciales int ant = K; int act = K * K - 1; int temp; /* * Partimos de los casos mas pequeños hasta llegar * al caso mas grande N. */ for( int i = 3; i <= N; i ++ ) { temp = ( K - 1 ) * ( ant + act ); ant = act; act = temp; } return act; } }
Hello, thanx for you solution.
ResponderEliminar