結果
| 問題 |
No.2174 3 O'clock Easy
|
| ユーザー |
Nachia
|
| 提出日時 | 2022-12-26 22:14:45 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 36 ms / 2,000 ms |
| コード長 | 2,944 bytes |
| コンパイル時間 | 170 ms |
| コンパイル使用メモリ | 13,056 KB |
| 実行使用メモリ | 11,392 KB |
| 最終ジャッジ日時 | 2024-11-21 08:48:12 |
| 合計ジャッジ時間 | 1,167 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 9 |
ソースコード
import math
def regularizedFrac(a) :
if a[0] == 0 and a[1] == 0 :
return [0, 1]
g = math.gcd(abs(a[0]), abs(a[1]))
if a[0] < 0 and a[1] < 0 :
g = -g
return [a[0] // g, a[1] // g]
def negFrac(a) :
return [-a[0], a[1]]
def addFrac(a, b) :
return regularizedFrac([a[0] * b[1] + a[1] * b[0], a[1] * b[1]])
def mulFrac(a, b) :
return regularizedFrac([a[0] * b[0], a[1] * b[1]])
def divFrac(a, b) :
return regularizedFrac([a[0] * b[1], a[1] * b[0]])
def powFrac(a, t) :
return regularizedFrac([a[0] ** t, a[1] ** t])
def evalPolynomial(po, x) :
a = [1, 1]
res = [0, 1]
for c in po :
res = addFrac(res, mulFrac(a, c))
a = mulFrac(a, x)
return res
factorialFrac = [[1, 1]]
for j in range(1, 35) :
factorialFrac.append(mulFrac(factorialFrac[-1], [j, 1]))
def combFrac(n, r) :
return divFrac(factorialFrac[n], mulFrac(factorialFrac[n-r], factorialFrac[r]))
bernoulliFrac = [[1, 1]]
for n in range(1, 30) :
tmp = [0, 1]
for k in range(n) :
tmp = addFrac(tmp, mulFrac(bernoulliFrac[k], combFrac(n+1, k)))
bernoulliFrac.append(mulFrac(tmp, [1, -(n+1)]))
integralCoeff = [[[0,1],[1,1]]]
for k in range(1, 30) :
tmp = [[0, 1]]
for j in range(1, k+2) :
tmp.append(mulFrac([1, k+1], mulFrac(combFrac(k+1, k+1-j), bernoulliFrac[k+1-j])))
integralCoeff.append(tmp)
def addFracPolynomials(a, b) :
res = [[0,1] for j in range(max(len(a), len(b)))]
for j in range(len(a)) :
res[j] = addFrac(res[j], a[j])
for j in range(len(b)) :
res[j] = addFrac(res[j], b[j])
return res
def mulFracPolynomials(a, b) :
if len(a) == 0 or len(b) == 0 :
return []
res = [[0,1] for j in range(len(a) + len(b) - 1)]
for i in range(len(a)) :
for j in range(len(b)) :
res[i+j] = addFrac(res[i+j], mulFrac(a[i], b[j]))
return res
def powFracPolynomial(a, i) :
if i == 0 :
return [[1,1]]
b = powFracPolynomial(mulFracPolynomials(a, a), i//2)
if i % 2 == 1 :
b = mulFracPolynomials(a, b)
return b
def timesScholarPolynomials(a, t) :
return [mulFrac(c, t) for c in a]
def talorShift(a, t) :
res = [[0,1] for j in a]
for k in range(len(a)) :
for j in range(k+1) :
res[j] = addFrac(res[j], mulFrac(combFrac(k,j), mulFrac(a[k], powFrac(t, k-j))))
return res
def integerIntegral(f) :
res = []
for k in range(len(f)) :
res = addFracPolynomials(res, timesScholarPolynomials(integralCoeff[k], f[k]))
return res
k1 = [[1,1],[3,1]]
k2 = powFracPolynomial([[2,1],[3,1]], 2)
k3 = powFracPolynomial([[3,1],[3,1]], 3)
ksum = addFracPolynomials(k1, addFracPolynomials(k2, k3))
kintegral = integerIntegral(ksum)
n = int(input())
ans = evalPolynomial(kintegral, [n//3,1])[0]
k = n // 3
if n >= k * 3 + 1 :
ans += (k * 3 + 1) ** 1
if n >= k * 3 + 2 :
ans += (k * 3 + 2) ** 2
print(ans)
Nachia