結果

問題 No.313 π
ユーザー ir5ir5
提出日時 2024-06-11 22:45:58
言語 Python3
(3.12.2 + numpy 1.26.4 + scipy 1.12.0)
結果
AC  
実行時間 685 ms / 5,000 ms
コード長 2,067 bytes
コンパイル時間 231 ms
コンパイル使用メモリ 12,928 KB
実行使用メモリ 13,976 KB
最終ジャッジ日時 2024-06-11 22:46:25
合計ジャッジ時間 25,361 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 665 ms
13,848 KB
testcase_01 AC 662 ms
13,852 KB
testcase_02 AC 668 ms
13,724 KB
testcase_03 AC 652 ms
13,848 KB
testcase_04 AC 639 ms
13,724 KB
testcase_05 AC 670 ms
13,840 KB
testcase_06 AC 642 ms
13,852 KB
testcase_07 AC 682 ms
13,724 KB
testcase_08 AC 641 ms
13,720 KB
testcase_09 AC 666 ms
13,724 KB
testcase_10 AC 663 ms
13,848 KB
testcase_11 AC 685 ms
13,976 KB
testcase_12 AC 652 ms
13,760 KB
testcase_13 AC 669 ms
13,724 KB
testcase_14 AC 681 ms
13,720 KB
testcase_15 AC 654 ms
13,852 KB
testcase_16 AC 677 ms
13,724 KB
testcase_17 AC 648 ms
13,720 KB
testcase_18 AC 675 ms
13,852 KB
testcase_19 AC 643 ms
13,720 KB
testcase_20 AC 645 ms
13,852 KB
testcase_21 AC 644 ms
13,796 KB
testcase_22 AC 660 ms
13,852 KB
testcase_23 AC 683 ms
13,720 KB
testcase_24 AC 645 ms
13,976 KB
testcase_25 AC 632 ms
13,848 KB
testcase_26 AC 656 ms
13,772 KB
testcase_27 AC 652 ms
13,720 KB
testcase_28 AC 664 ms
13,728 KB
testcase_29 AC 649 ms
13,852 KB
testcase_30 AC 676 ms
13,720 KB
testcase_31 AC 654 ms
13,728 KB
testcase_32 AC 654 ms
13,852 KB
testcase_33 AC 658 ms
13,720 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

# https://qiita.com/ykoba1994/items/44dd55c53663cec08398
from decimal import Decimal, getcontext, MAX_EMAX, MIN_EMIN
import math, time
from sys import argv
getcontext().Emax = MAX_EMAX # 指数部の指定
getcontext().Emin = MIN_EMIN # 指数部の指定


# cdecimalが含まれるか確認
def confirm_cdecimal():
    a = True
    try:
        import _decimal
    except ModuleNotFoundError:
        a = False
    return a


# 平方根関数
def my_sqrt(x):
    x2 = Decimal(x)
    if getcontext().prec <= 128:
        return x2.sqrt()
    else:
        prec_orig = getcontext().prec
        t = (prec_orig * 53) // 100
        prec_list = []
        while t > 128:
            prec_list.append(t)
            t = t // 2
        prec_list.reverse()
        getcontext().prec = 128
        a = 1 / x2.sqrt()
        for i in prec_list:
            getcontext().prec = i + 10
            a = a + (a * (Decimal(1) - x2 * (a * a)) / Decimal(2))
        getcontext().prec = prec_orig
        a = a + (a * (Decimal(1) - x2 * (a * a)) / Decimal(2))
        return  x2 * a


# Binary Splitting
def computePQT(a, b):
    if b == a + 1:
        p_int = (1 - 2*b) * (6*b - 5) * (6*b - 1)
        q_int = (b**3) * 10939058860032000
        t_int = p_int * (13591409 + 545140134*b)
        return [Decimal(p_int), Decimal(q_int), Decimal(t_int)]
    else:
        m = (a + b) // 2
        [pam, qam, tam] = computePQT(a, m)
        [pmb, qmb, tmb] = computePQT(m, b)
        p = pam * pmb
        q = qam * qmb
        t = tam * qmb + pam * tmb
        return [p, q, t]


# 円周率計算
def chudnovsky_pi(n):
    getcontext().prec = n
    terms = math.ceil(n / 14.181647462) + 10
    [_, q, t] = computePQT(0, terms)
    num = q * Decimal(426880) * my_sqrt(10005)
    den = t + q * Decimal(13591409)
    return num / den


def main():
    prec = 2 * 10 ** 5 + 10
    pi = chudnovsky_pi(prec)
    pi = str(pi)
    s = input()
    for i in range(len(s)):
        if pi[i] != s[i]:
            print(f"{s[i]} {pi[i]}")
            break


if __name__ == "__main__":
    main()
0