0 ~ 9까지의 숫자는 위처럼 표기할 수 있다.
이 때 꺼져 있는 버튼을 키거나 켜져 있는 버튼을 1개 끄는 것을 "1개가 반전되었다"라고 한다.
엘리베이터가 실제로 X층에 멈춰 있을 때, 1개 ~ P개를 반전시켜 X층과는 다른 숫자를 만드려고 한다. 이 때 만들 수 있는 다른 층의 경우의 수를 구하는 문제이다.
바꿀 수 있는 수는 1이상 N이하이다.
X를 1 ~ N까지 숫자에 대해 몇 개를 반전시켜야 하며, 만약 반전시킨 개수가 P이하라면 답에 포함시키는 형식으로 문제를 풀었다.
0 ~ 9까지 불 켜져 있는 칸을 1 ~ 8로 표현하여 불이켜져 있는 부분을 1, 꺼져있는 부분을 0으로 취급하여 1개 숫자를 반전시킬 때 사용되는 불의 개수를 구했다.
import java.io.*;
import java.util.*;
public class Main {
static StringBuilder sb = new StringBuilder();
static int N, K, P, X;
static String real_K;
static int[][] change = new int[10][10];
static int ans = 0;
static void fill() {
// 1
// 2 3
// 4
// 5 6
// 7
// 불의 위치는 위와 같이 결정했고, 서로 값이 다르면 반전시켜야하는 불이다
int[][] arr = new int[10][8];
arr[0][1] = 1;
arr[0][2] = 1;
arr[0][3] = 1;
arr[0][5] = 1;
arr[0][6] = 1;
arr[0][7] = 1;
arr[1][3] = 1;
arr[1][6] = 1;
Arrays.fill(arr[2], 1);
arr[2][2] = 0;
arr[2][6] = 0;
Arrays.fill(arr[3], 1);
arr[3][2] = 0;
arr[3][5] = 0;
Arrays.fill(arr[4], 1);
arr[4][1] = 0;
arr[4][5] = 0;
arr[4][7] = 0;
Arrays.fill(arr[5], 1);
arr[5][3] = 0;
arr[5][5] = 0;
Arrays.fill(arr[6], 1);
arr[6][3] = 0;
arr[7][1] = 1;
arr[7][3] = 1;
arr[7][6] = 1;
Arrays.fill(arr[8], 1);
Arrays.fill(arr[9], 1);
arr[9][5] = 0;
for(int i =0;i<10;i++) {
for(int j =i+1;j<10;j++) {
for(int t =1;t<8;t++) {
if(arr[i][t]!=arr[j][t]) {
change[i][j]++;
}
}
}
}
}
static void rec() {
for(int i = 1;i<=N;i++) {
int tmp = 1000000;
String tmp2 = Integer.toString(tmp+i).substring(7-K,7);
int cha = 0;
for(int j =0;j<K;j++) {
cha += Math.max(
change[real_K.charAt(j)-'0'][tmp2.charAt(j)-'0'],
change[tmp2.charAt(j)-'0'][real_K.charAt(j)-'0']);
// change[A][B] 중 A<B일 때만 값이 저장되어 있다
// 따라서, Math.max로 A<B인 경우만 선택한다.
}
if(cha>=1 && cha <=P) ans++;
}
}
public static void main(String[] args) {
FastReader sc = new FastReader();
N = sc.nextInt(); // 1 ~ N층까지 존재
K = sc.nextInt(); // K자리 수가 보임
P = sc.nextInt(); // 최소1개 ~ 최대 P개를 반전
X = sc.nextInt(); // 실제로는 X층에 멈춰 있음
fill();
int tmp = 1000000;
real_K = Integer.toString(tmp+X).substring(7-K,7);
// 5를 표현할 때 00005 등으로 표현해야 하므로 활용한 방법
// 1000005로 만든 이후 원하는 부분만 뒤에서 뽑아내면 됨
rec();
System.out.println(ans);
}
static class FastReader // 빠른 입력을 위한 클래스
}