거꾸로 생각합시다. k-transform으로 만들어지는 수는 의 꼴()이고, 여기서 이 됩니다. 저걸 전개해버리면 입니다. 이걸 진 수로 생각하면 , 그러니까 인 모든 진 수의 개수를 구하는 문제가 됩니다.
쉽지 않네요... 그렇죠? 애초에 제약 없이 수를 나누는 문제도 중복조합으로 풀어야 하는데... 제약이 더 걸려있으니 까다롭지요.
대단한 공식은 구해 봐야 시간 내에 계산할 수 없는 꼴일 가능성이 높고, 음... 어떻게 하면 좋을까요.
어떤 진 수 의 첫번째 자리 수, 그러니까 가 인 경우, 인 경우, 인 경우... 인 경우로 나눠 봅시다. 이 때 의 이 라면:
인 경우는 모든 인 진 수에 각각 를 곱해서 만들 수 있고,
인 경우는 모든 인 진 수에 각각 를 곱한 뒤 을 더해서 만들 수 있고
...
그렇게 생각하면 인 모든 경우를 다 더해서 인 경우를 만들 수 있습니다.
그런데 이건 원래 구하려고 했던 게 아니잖아요? 자릿수도 고려대상에 넣어야 하잖아요? 를 곱한다는 것은 연산을 하나 소모하는 거고... 그럴 거면 애초에 이 아니고 (앞으로 로 줄여 부를게요)을 가지고 뭘 해야겠죠.
또 다시 어떤 진 수 의 값을 가지고 경우를 나눠 봅시다. 인 경우는 모든 인 진 수에 를 곱해서 만들 수 있습니다. 는 인 경우에 곱하고 더해서... 그렇게 을 더하는 경우까지 가면 가 부터 인 경우까지 쭉 더하면 인 모든 경우의 수가 나온다는 걸 알 수 있습니다. 보기 편하게 정리할까요.
는 그냥 상수로 두고, 를 인 모든 진 수의 개수라고 합시다. 그럼 가 됩니다.
이전 개의 항으로 결정되는 선형 점화식을 얻었습니다. 이제 키타마사법을 적용하면 의 값을 에 구할 수 있습니다. 시간 초과도 받을 수 있습니다. 는 너무 큽니다.
키타마사를 돌릴 적에, 다항식 나눗셈에 대한 추가적인 최적화가 가능합니다. 이게 점화식의 계수가 다 같아서 할 수 있는 짓인데, 다항식 으로 다른 다항식을 나눌 때를 잘 관찰해 보면 연속적인 구간에 다 같은 값을 더하는 짓을 반복합니다. 여기에 레이지 세그를 먹이면 에 다항식 나머지를 구하는 짓이 가능해집니다.
근데 ~ 을 구해야 키타마사를 돌리겠죠? 저건 잘 모르겠으니 냅다 나열해봅시다. 우선 편의상 가 충분히 큰 임의의 자연수라고 합시다. 한 100이면 괜찮을까요.
입니다. 이 있습니다.
입니다. 가 있습니다.
입니다. 이 있습니다.
입니다. 이 있습니다.
딱 감이 오죠? 이거 입니다. 애초에 모든 경우에서 두 갈래로(, ) 뻗어나갈 수 있는데 최종 겹치는 경우는 하나도 없으니깐 성립합니다. 그러다가 1에서 로만 뻗은 가지가 를 건드리면 끝납니다.