結果
問題 |
No.493 とても長い数列と文字列(Long Long Sequence and a String)
|
ユーザー |
![]() |
提出日時 | 2025-06-12 16:45:13 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,030 bytes |
コンパイル時間 | 302 ms |
コンパイル使用メモリ | 82,336 KB |
実行使用メモリ | 97,076 KB |
最終ジャッジ日時 | 2025-06-12 16:45:32 |
合計ジャッジ時間 | 14,980 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 55 TLE * 1 -- * 59 |
ソースコード
MOD = 10**9 + 7 # Precompute len_dict for n up to 70 len_dict = {1: 1} max_n = 1 while True: max_n += 1 prev_len = len_dict[max_n - 1] n_squared = max_n * max_n len_middle = len(str(n_squared)) new_len = 2 * prev_len + len_middle len_dict[max_n] = new_len if new_len > 10**18: break if max_n > 70: break def compute(n, a, b): if a > b: return (0, 1, True) if n == 1: if a == 1 and b == 1: return (1, 1, True) else: return (0, 1, False) len_left = len_dict.get(n-1, 0) len_middle = len(str(n * n)) len_right = len_left total_len = 2 * len_left + len_middle if a > total_len or b > total_len: return (0, 1, False) left_end = len_left middle_start = left_end + 1 middle_end = left_end + len_middle right_start = middle_end + 1 right_end = total_len res_sum = 0 res_prod = 1 i = a while i <= b: if i <= left_end: part_start = i part_end = min(b, left_end) sum_val, prod_val, valid = compute(n-1, part_start, part_end) if not valid: return (0, 1, False) res_sum += sum_val res_prod = (res_prod * prod_val) % MOD i = part_end + 1 elif i <= middle_end: part_start = i part_end = min(b, middle_end) s = str(n * n) start_pos = part_start - left_end - 1 end_pos = part_end - left_end - 1 if start_pos < 0 or end_pos >= len(s): return (0, 1, False) substr = s[start_pos:end_pos+1] sum_middle = 0 prod_middle = 1 for c in substr: if c == '0': val = 10 else: val = int(c) sum_middle += val prod_middle = (prod_middle * val) % MOD res_sum += sum_middle res_prod = (res_prod * prod_middle) % MOD i = part_end + 1 else: part_start = i part_end = min(b, right_end) local_start = part_start - right_start + 1 local_end = part_end - right_start + 1 sum_val, prod_val, valid = compute(n-1, local_start, local_end) if not valid: return (0, 1, False) res_sum += sum_val res_prod = (res_prod * prod_val) % MOD i = part_end + 1 return (res_sum, res_prod, True) def main(): import sys K, L, R = map(int, sys.stdin.readline().split()) if L > R: print(-1) return if K <= 70: len_K = len_dict.get(K, 0) if len_K < R: print(-1) return else: if R > 10**18: print(-1) return sum_total, prod_total, valid = compute(K, L, R) if not valid: print(-1) else: print(sum_total, prod_total % MOD) if __name__ == "__main__": main()