문제 링크
각 테스트 케이스 abcd가 주어질 때 ZZ(c,d)를 구하면 되는 문제입니다. ZZ의 점화식은 아래와 같습니다.
ZZ(0,1)=aZZ(0,2)=bZZ(0,k)=ZZ(0,k−1)+ZZ(0,k−2);k≥3ZZ(i,k)=j=1∑kZZ(i−1,j);i≥1,k≥1
위 점화식을 이리저리 가지고 놀다보면 다음 식을 얻을 수 있습니다.
ZZ(1,k)=ZZ(0,k+2)−(0k)⋅bZZ(2,k)=ZZ(1,k+2)−(1k+1)⋅b−(0k+1)⋅a⋯
뭔가 일반화가 가능할것 같이 생겼습니다. 진짜 일반화가 될까요? 아래 내용을 증명해 보겠습니다.
Theorem. ZZ(c,d)=ZZ(c−1,d+2)−(c−1d+c−1)⋅b−(c−2d+c−1)⋅a
일단 c=1일때는 직접 계산해보면 어렵지 않게 보일 수 있습니다.
c=1,2,⋯,k−1일때 Theorem이 성립 한다고 가정해 보겠습니다.
ZZ(k,d)=ZZ(k−1,1)+⋯+ZZ(k−1,d)=ZZ(k−2,1)−(k−3k−3)⋅a+ZZ(k−2,2)−(k−2k−2)⋅b−(k−3k−2)⋅a+ZZ(k−2,3)−(k−2k−1)⋅b−(k−3k−1)⋅a+ZZ(k−2,4)−(k−2k)⋅b−(k−3k)⋅a+⋯+ZZ(k−2,d+2)−(k−2k+d−2)⋅b−(k−3k+d−2)⋅a=ZZ(k−1,d+2)−(k−1k+d−1)⋅b−(k−2k+d−1)⋅a
즉, c=1,2,⋯,k−1일때 Theorem이 성립하면 c=k일때도 성립한다는 사실을 알 수 있고 수학적 귀납법에 의하여 Theorem이 증명되었습니다.
이제 Theorem을 가지고 각 테스트 케이스를 해결하면 됩니다. 최종적으로 ZZ(0,d+2c)와 2c개의 Combination을 계산하면 됩니다.
각 Combination은 1!부터 (c−1)!까지의 역원을 미리 전처리 해놓으면 O(c)에 계산할 수 있고 ZZ(0,d+2c)는 O(log(d+2c))에 계산할 수 있습니다.
즉 전체 시간 복잡도는 O(T⋅(log(d+2c)+c2))입니다.