Sa=k=2∑ai=1∑kj=i+1∑kgcd(bi,bj)(2≤a≤n−1)라고 한다면 Sa−Sa−1=i=1∑aj=i+1∑agcd(bi,bj)가 되고 Ta=Sa−Sa−1이라고 하면 Ta−Ta−1=i=1∑a−1gcd(bi,ba)이 됩니다. 즉, 어떻게든 i=1∑a−1gcd(bi,ba)를 계산하면 T의 다음 항을 구할 수 있고 또한, S의 다음항도 구할 수 있게 됩니다.
i=1∑a−1gcd(bi,ba)는 아래와 같은 과정으로 계산합니다.
1. 이전부터 b1,...,ba−1의 약수들을 카운트합니다.
2. ba의 약수들을 큰 수 부터 작은 수 순으로 탐색합니다. 이 때, 아래 과정을 반복합니다. 2-1. 1. 에서 d가 카운트된 횟수를 cnt라고 하면 cnt⋅d를 더합니다. gcd(bi,ba)=d인 i의 갯수가 cnt임을 의미하기 때문입니다. 그리고 1. 에서 카운트한 값들 중 d의 약수에 해당하는 카운트 값들을 cnt만큼 빼줍니다.
이렇게하면 다음 Ta−Ta−1를 구할 수 있고 위에서 설명했듯이 S의 다음항 또한 구할 수 있습니다.
지금까지 설명한 방법의 시간복잡도는 O(n⋅(max(a)+2835))입니다. 사실 이 시간복잡도만 놓고 봤을때는 2초가 되려나 싶었는데 390ms로 AC를 받았습니다. 코포는 AC를 받으면 테케를 공개해줘서 확인해봤는데 더 강한 데이터가 있는것 같긴하지만 그게 들어간다고 해도 제 답안이 TLE를 받을 것 같지는 않았습니다. 시간복잡도를 계산할 때 무언가 누락됐거나 딱히 무거운 연산이 없기도 해서 돌아가는 것 같기도 한데... 나중에 조금 더 살펴봐야겠습니다.