結果

問題 No.493 とても長い数列と文字列(Long Long Sequence and a String)
ユーザー gew1fw
提出日時 2025-06-12 13:50:36
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 1,942 bytes
コンパイル時間 214 ms
コンパイル使用メモリ 82,688 KB
実行使用メモリ 85,040 KB
最終ジャッジ日時 2025-06-12 13:51:40
合計ジャッジ時間 3,702 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 2 WA * 3 TLE * 1 -- * 109
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
MOD = 10**9 + 7

def digits(n):
    return len(str(n))

def compute_len(n):
    if n == 1:
        return 1
    max_d = digits(n**2)
    total = 0
    total += (1 << (n-1))
    for d in range(1, max_d + 1):
        lower = 10**((d-1)/2)
        start = int(lower)
        if start**2 < 10**(d-1):
            start += 1
        upper = (10**d)**0.5
        end = int(upper)
        while (end + 1)**2 < 10**d:
            end += 1
        start = max(start, 2)
        end = min(end, n)
        if start > end:
            continue
        a = start
        b = end
        exponent_a = n - a + 1
        exponent_b = n - b
        term_a = (1 << exponent_a) if exponent_a >= 0 else 0
        term_b = (1 << exponent_b) if exponent_b >= 0 else 0
        sum_terms = term_a - term_b
        total += d * sum_terms
    return total

def get_digit(n, pos):
    while True:
        if n == 1:
            return 1
        len_prev = compute_len(n-1)
        d_n = digits(n**2)
        mid_start = len_prev + 1
        mid_end = len_prev + d_n
        if pos <= len_prev:
            n -= 1
        elif mid_start <= pos <= mid_end:
            s = str(n*n)
            return int(s[pos - mid_start])
        else:
            pos -= (len_prev + d_n)
            n -= 1

def main():
    K, L, R = map(int, sys.stdin.readline().split())
    if K >= 60:
        len_K = (1 << (K-1)) + 1
        if R >= len_K:
            print(-1)
            return
    else:
        len_K = compute_len(K)
        if R > len_K:
            print(-1)
            return
    sum_total = 0
    product_total = 1
    for pos in range(L, R+1):
        digit = get_digit(K, pos)
        if digit == 0:
            sum_total += 10
            product_total = product_total * 10 % MOD
        else:
            sum_total += digit
            product_total = product_total * digit % MOD
    print(sum_total, product_total)

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