MATKOR 문자열 만들기
시간 제한3초메모리 제한1024 MB
문자열의 글자를 바꾸는 쿼리와 구간 질의가 주어질 때, 구간을 MATKOR로 만드는 방법의 수와 연산 횟수의 분산을 구합니다.
문제
재현이는 알파벳 대문자로만 이루어진 문자열 를 가지고 있다. 재현이는 이 문자열의 일부를 잘라 종우에게 선물하려고 한다. 종우는 선물 받은 문자열을 아래 과정으로 MATKOR로 만들고 싶어 한다.
선물 받은 문자열을 이라고 하자.
부터 까지 각 문자에 아래 연산을 적용한다.
- 삭제 연산: 해당 위치의 문자를 삭제한다.
- 대체 연산: 해당 위치의 알파벳을 다음 알파벳으로 바꾼다. 예를 들어
A는B로,B는C로 바꿀 수 있다.Z에는 이 연산을 적용할 수 없다.- 대체 연산은 여러 번 적용할 수 있지만, 삭제 연산은 한 번만 적용할 수 있다.
- 각 문자에는 최대 한 종류의 연산만 적용할 수 있다. 연산을 적용하지 않아도 된다.
연산을 모두 적용한 뒤 문자열이 MATKOR가 되어야 한다.
재현이는 아래 쿼리에 대한 답을 알고 싶다. 쿼리에서 와 는 1 이상 이하의 정수이고, 는 대문자 알파벳이다.
- : 를 로 바꾼다.
- : 재현이가 종우에게 를 선물했을 때, 종우가 이 문자열을
MATKOR로 만드는 방법의 수와 각 방법에서 총 연산 횟수의 분산을 구한다. 문자별로 적용된 연산의 종류와 횟수가 같으면 같은 방법으로 본다.
여기서 분산은 가능한 모든 서로 다른 연산 방법에 대해, 방법별 연산 횟수에서 전체 평균을 뺀 값의 제곱의 평균이다. 가능한 모든 연산 방법의 집합을 , 방법 에서 사용한 연산 횟수를 라고 하면 분산은 다음과 같다.
입력
첫 번째 줄에 알파벳 대문자로 이루어진 문자열 ()가 주어진다. 두 번째 줄에 쿼리의 수 ()가 주어진다. 세 번째 줄부터 개의 줄에 다음 두 쿼리 중 하나가 주어진다. 쿼리 2는 적어도 한 번 이상 주어진다.
- (; 는 대문자 알파벳)
- ()
출력
쿼리 2가 주어질 때마다 방법의 수와 분산을 공백으로 구분하여 한 줄에 출력한다.
방법의 수는 매우 커질 수 있으므로 로 나눈 나머지를 출력한다. 방법의 수를 로 나눈 나머지가 이면 분산은 출력하지 않는다.
기약 분수 (, , )를 으로 나눈 나머지는 을 만족하는 정수 을 사용하여 으로 정의한다. 정수인 경우 이므로 을 뜻한다.
방법의 수를 로 나눈 나머지가 이 아니라면, 분산은 정수이거나 분모가 의 배수가 아닌 유리수로 나타낼 수 있음이 증명된다.