結果

問題 No.1334 Multiply or Add
ユーザー lam6er
提出日時 2025-04-16 16:04:13
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 2,954 bytes
コンパイル時間 508 ms
コンパイル使用メモリ 81,996 KB
実行使用メモリ 104,576 KB
最終ジャッジ日時 2025-04-16 16:10:43
合計ジャッジ時間 7,487 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 51 WA * 20
権限があれば一括ダウンロードができます

ソースコード

diff #

MOD = 10**9 + 7

n = int(input())
a = list(map(int, input().split()))

blocks = []
current_numbers = None
current_ones = None

for num in a:
    if num == 1:
        if current_numbers is not None:
            blocks.append(current_numbers)
            current_numbers = None
        if current_ones is None:
            current_ones = {'is_numbers': False, 'count': 0}
        current_ones['count'] += 1
    else:
        if current_ones is not None:
            blocks.append(current_ones)
            current_ones = None
        if current_numbers is None:
            current_numbers = {
                'is_numbers': True,
                'product_mod': num % MOD,
                'count': 1,
                'product_ge3': num >= 3
            }
        else:
            current_numbers['product_mod'] = (current_numbers['product_mod'] * num) % MOD
            current_numbers['count'] += 1
            if current_numbers['count'] >= 2:
                current_numbers['product_ge3'] = True

if current_numbers is not None:
    blocks.append(current_numbers)
if current_ones is not None:
    blocks.append(current_ones)

processed_blocks = []
i = 0
n_blocks = len(blocks)

while i < n_blocks:
    current_block = blocks[i]
    if current_block['is_numbers']:
        processed_blocks.append(current_block)
        i += 1
    else:
        if i == 0 or i == n_blocks - 1:
            processed_blocks.append(current_block)
            i += 1
        else:
            prev_block = processed_blocks[-1] if processed_blocks else None
            next_block = blocks[i + 1] if (i + 1 < n_blocks) else None
            if prev_block and next_block and prev_block['is_numbers'] and next_block['is_numbers']:
                if current_block['count'] == 1:
                    if prev_block['product_ge3'] or next_block['product_ge3']:
                        merged_product_mod = (prev_block['product_mod'] * next_block['product_mod']) % MOD
                        merged_block = {
                            'is_numbers': True,
                            'product_mod': merged_product_mod,
                            'count': prev_block['count'] + next_block['count'] + 1,
                            'product_ge3': True
                        }
                        processed_blocks.pop()
                        processed_blocks.append(merged_block)
                        i += 2
                    else:
                        processed_blocks.append({'is_numbers': False, 'count': 1})
                        i += 1
                else:
                    processed_blocks.append(current_block)
                    i += 1
            else:
                processed_blocks.append(current_block)
                i += 1

sum_total = 0
for block in processed_blocks:
    if block['is_numbers']:
        sum_total = (sum_total + block['product_mod']) % MOD
    else:
        sum_total = (sum_total + block['count']) % MOD

print(sum_total)
0