結果
| 問題 |
No.493 とても長い数列と文字列(Long Long Sequence and a String)
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 18:55:15 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,942 bytes |
| コンパイル時間 | 187 ms |
| コンパイル使用メモリ | 82,084 KB |
| 実行使用メモリ | 76,356 KB |
| 最終ジャッジ日時 | 2025-06-12 18:55:24 |
| 合計ジャッジ時間 | 3,138 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 2 WA * 3 TLE * 1 -- * 109 |
ソースコード
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()
gew1fw