P=998244353이라 하자. a의 자릿수가 d이면 rep(a,b)는 다음과 같다.
rep(a,b)=ak=0∑b−110dk=a10d−110db−1.
1≤d≤10에서 10d−1은 P의 배수가 아니므로 모듈러 역원으로 나눗셈을 계산할 수 있다. Gd(b)를 위 식의 등비급수 부분을 P로 나눈 나머지라고 하자.
Ai의 자릿수를 di라 하자. 인덱스 i가 왼쪽 끝인 모든 쌍의 곱은 다음과 같다.
AiN−ij=i+1∏NGdi(Aj)
따라서 오른쪽에서 왼쪽으로 순회하면서 자릿수 d별 접미 곱 Sd=∏j>iGd(Aj)를 유지한다. 먼저 정답에 AiN−iSdi를 곱하고, 그다음 모든 Sd에 Gd(Ai)를 곱한다. 이 순서여야 (i,i)가 포함되지 않는다.
10d−1의 역원은 미리 구한다. Gd(Ai)를 계산할 때는 x=10AimodP를 한 번 구한 뒤 x1,x2,⋯,x10을 차례로 곱해 사용한다. 한 케이스의 시간 복잡도는 O(N(10+logN+logmaxAi)), 공간 복잡도는 O(N)이다.
증명
각 i를 처리하기 직전에 Sd는 정확히 j>i인 원소들의 Gd(Aj)를 모두 곱한 값이다. 처음에는 오른쪽 원소가 없으므로 모든 Sd=1이다. i의 기여분을 정답에 곱한 뒤 Gd(Ai)를 Sd에 곱하면 다음 인덱스에 대해서도 불변식이 유지된다.
각 쌍 (i,j)는 왼쪽 끝 i를 처리할 때 Ai 한 번과 Gdi(Aj) 한 번으로 포함된다. 다른 단계에서는 포함되지 않는다. 따라서 마지막 값이 요구한 모든 쌍의 곱이다.
서브태스크 1에서는 수를 직접 이어 붙여도 된다. 서브태스크 2에서는 모든 쌍을 순회하며 등비급수 식으로 계산한다. 서브태스크 3에서는 자릿수가 항상 1이므로 접미 곱 하나만 관리한다. 전체 조건에서는 자릿수 1부터 10까지 각각 접미 곱을 관리한다.
Solution written by GPT5