白駿9020-金バッハの推測


白骏9020-金巴赫的推测


少数の関連問題

解法


  • 小数点以下のリストを作成します.

  • 入力値の半分に最も近い小数または等しい小数(a)を検索し、小数リストでaのインデックス値を検索します.

  • aを加えて、入力値として別の小数(b)を探します.

  • 条件を満たすbがない場合、インデックスがaより小さい小数を検索します.

  • 条件を満たすa,bが見つかるまで3−4を繰り返す.
  • コード#コード#

    #에라토스테네스의 체를 만들기 위한 리스트 생성
    tlst = [False, False] + [True]*(10000-1)
    #소수를 저장할 리스트 생성
    plst = []
    
    for i in range(2, int(101)):
    #101은 10000에 루트를 씌운 값(100) + 1 (range함수는 이하부터 미만이므로 +1을 해줘야함)
        if tlst[i] == True:
            j = 2
            while i*j <= 10000:
                tlst[i*j] = False
                j += 1
                #소수 i의 배수들을 False로 초기화
    for i in range(len(tlst)):
        if tlst[i] == True:
            plst.append(i)
            #소수를 plst에 저장
        
    
    def Gold_vach(num):
        idx = max([i for i in range(len(plst)) if plst[i] <= num//2])
        #plst중 num/2에 가장 가까우면서 작거나 같은 수의 인덱스를 idx에 초기화
        for i in range(idx, -1, -1):
        #idx에서 출발해서 점점 작아지다가 0까지 조회
            for j in range(i, len(plst)-1):
            #idx에서 출발해서 점점 커지다가 최대값까지 조회
                if plst[i] + plst[j] == num:
                    return plst[i], plst[j]
                elif plst[i] + plst[j] > num:
                    break
                    #합이 num보다 커지면 빠르게 반환
    
    T = int(input())
    for case in range(T):
        N = int(input())
        a, b = Gold_vach(N)
        print(a,b)

    考慮すべき問題


    最初に問題を解くと、テスト例ごとに小数リスト(plst)が再生成され、時間がかかります.
    その後最初から小数リストを作成し,試験用例ごとに小数リストを用い,確認速度が7倍程度増加した.

    短い時間の人の解答を見て、小数を格納するリスト(plst)を別途生成するのではなく、予め生成したリスト(tlst)を用いて解答することを確認します.この方法を用いると,tlst真値を持つインデックスを数で解くことができる.しかし、今の実力で表現するには時間がかかるかもしれないので、勉強が進歩してから見ることにしました.