1009. K-based Numbers
Time limit: 0.5 second
Memory limit: 64 MB
Memory limit: 64 MB
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
Ndigits.
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 | output |
---|---|
2 10 | 90 |
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
new Task().solve();
}
}
class Task {
InputReader in = new InputReader(System.in);
PrintWriter out = new PrintWriter(System.out);
long[][][] dp = new long[19][2][11] ;
int[] bit ;
long dfs(int pos , int pre , int k){
if(pos == -1){
return 1 ;
}
if(dp[pos][pre][k] != -1){
return dp[pos][pre][k] ;
}
long sum = 0 ;
for(int i = 0 ; i < k ; i++){
if(pre == 0 && i == 0){
continue ;
}
sum += dfs(pos-1 , i == 0 ? 0 : 1 , k) ;
}
return dp[pos][pre][k] = sum ;
}
void solve() {
for(int i = 0 ; i < 19 ; i++){
for(int j = 0 ; j < 2 ; j++){
Arrays.fill(dp[i][j] , -1) ;
}
}
while(in.hasNext()){
int n = in.nextInt() ;
int k = in.nextInt() ;
out.println(dfs(n-1 , 0 , k)) ;
out.flush() ;
}
out.flush();
}
}
class InputReader {
public BufferedReader reader;
public StringTokenizer tokenizer;
public InputReader(InputStream stream) {
reader = new BufferedReader(new InputStreamReader(stream), 32768);
tokenizer = new StringTokenizer("");
}
private void eat(String s) {
tokenizer = new StringTokenizer(s);
}
public String nextLine() {
try {
return reader.readLine();
} catch (Exception e) {
return null;
}
}
public boolean hasNext() {
while (!tokenizer.hasMoreTokens()) {
String s = nextLine();
if (s == null)
return false;
eat(s);
}
return true;
}
public String next() {
hasNext();
return tokenizer.nextToken();
}
public int nextInt() {
return Integer.parseInt(next());
}
public int[] nextInts(int n){
int[] nums = new int[n] ;
for(int i = 0 ; i < n ; i++){
nums[i] = nextInt() ;
}
return nums ;
}
public long nextLong() {
return Long.parseLong(next());
}
public double nextDouble() {
return Double.parseDouble(next());
}
public BigInteger nextBigInteger() {
return new BigInteger(next());
}
}