따라서, 각 항을 차례대로 공비를 곱해가며, 그 결과를 더해 주면 전체 제곱의 합을 구할 수 있다. 문제는 모듈로 연산을 포함할 때, 나눗셈은 지원하지 않는다. 모듈러 연산의 역원과 페르마의 소정리를 구해 주어야 한다. 자세한 정리는 나중에 하기로 하고, 그 결과는 이렇다 : (이 때 모듈러 연산의 m이 소수여야만 성립한다)
$$ a^{-1} mod \; m = a^{mod-2} mod \; m $$
이 때, mod-2는 매우 큰 수이므로 이러한 제곱 연산 역시 최적화해주어야 한다. 앞선 문제에서도 이러한 제곱 연산을 줄이는 코드를 다룬 바 있다.
처음엔 모듈러 연산 역원을 고려하지 않아서 맞왜틀만 외치고다녔는데... 바로 떠올리는 습관이 필요하다!
풀이 코드
def pow(n, k):
if k == 0 :
return 1
if k == 1 :
return n
_n = (pow(n, k//2)) % MOD
_n = (_n*_n) % MOD
if k % 2 == 0:
return _n
else :
return (_n * n) % MOD
MOD = 99824353
x = int(input())
result = 1
tot_sum = 1
for i in range(1, x+1) :
result = (result *(4*i-2)) % MOD
mod_inv = pow(i, MOD - 2) % MOD
result = (result*mod_inv) % MOD
tot_sum = (result + tot_sum) % MOD
print(tot_sum)