반복수

시간 제한1초메모리 제한1024 MB

요약
K자리 수를 두 번 이상 이어 붙인 뒤 뒤에서 몇 자리를 잘라 만든 수 가운데 A 이상 B 이하이면서 M으로 나누어떨어지는 것의 개수를 센다.
난이도

어려움10점 중 9점

유형
정수론, 수학, 이분 탐색, 조합론
정답자
아직 제출이 없습니다

문제

하나의 KK자리 수를 원하는 만큼 연속해서 이어 붙인 뒤, 뒤에서부터 00개 이상의 연속된 숫자를 제거하여 만들어낸 KK자리 이상의 수를 KK-반복수라 한다. 가령, 2,462,4622\\,462\\,462는 33자리 수 246246을 세 번 이어 붙인 뒤, 마지막 두 자리 숫자를 제거하여 만들어낸 33-반복수이며, 2424는 33자리수 미만의 수이므로 33-반복수가 아니다.

AA 이상 BB 이하의 KK-반복수 중, MM으로 나누어 떨어지는 수의 개수를 구해보자.

입력

첫째 줄에 정수 A,B,K,MA,B,K,M이 공백으로 구분되어 주어진다. (1≤A≤B≤1012;(1\le A\le B\le 10^{12}; 1≤K≤6;1\le K\le 6; 1≤M≤1012)1\le M\le 10^{12})

출력

AA 이상 BB 이하의 KK-반복수 중, MM으로 나누어 떨어지는 수의 개수를 출력한다.

힌트

101210^{12}는 3232bit 정수형 타입 변수 범위를 초과할 수 있으므로, C/C++의 long long, Java의 Long 등 6464비트 정수형 타입을 사용해야 한다.

예제3

  1. 예제 1

    입력
    100 120 2 1
    
    예상 출력
    2
    
  2. 예제 2

    입력
    200 300 2 3
    
    예상 출력
    3
    
  3. 예제 3

    입력
    100 10000 3 3
    
    예상 출력
    600