結果
問題 |
No.3202 Periodic Alternating Subsequence
|
ユーザー |
![]() |
提出日時 | 2025-07-11 23:05:55 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 775 ms / 2,000 ms |
コード長 | 1,572 bytes |
コンパイル時間 | 220 ms |
コンパイル使用メモリ | 82,216 KB |
実行使用メモリ | 109,316 KB |
最終ジャッジ日時 | 2025-07-11 23:06:21 |
合計ジャッジ時間 | 16,587 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 24 |
ソースコード
t = input() k = int(input()) mod = 10 ** 9 + 7 dp = [[0, 0, 0], [0, 0, 1], [0, 0, 1], [0, 0, 0]] from copy import deepcopy as cp for i in range(len(t)): ndp = cp(dp) a = int(t[i]) for j in range(4): if j & 1 != a: ndp[j^1][0] += dp[j][0] + 2 * dp[j][1] + dp[j][2]; ndp[j^1][0] %= mod ndp[j^1][1] += dp[j][1] + dp[j][2]; ndp[j^1][1] %= mod ndp[j^1][2] += dp[j][2]; ndp[j^1][2] %= mod dp = ndp B = dp ans = [[0, 0, 0], [0, 0, 1], [0, 0, 1], [0, 0, 0]] while k: if k & 1: ndp = [[0, 0, 0] for _ in range(4)] for i in range(4): for j in range(4): if i & 1 != (j >> 1) & 1: nxt = (i & 2) | (j & 1) ndp[nxt][0] += ans[i][0] * B[j][2] + ans[i][2] * B[j][0] + 2 * ans[i][1] * B[j][1]; ndp[nxt][0] %= mod ndp[nxt][1] += ans[i][1] * B[j][2] + ans[i][2] * B[j][1]; ans[nxt][1] %= mod ndp[nxt][2] += ans[i][2] * B[j][2]; ndp[nxt][2] %= mod ans = ndp ndp = [[0, 0, 0] for _ in range(4)] for i in range(4): for j in range(4): if i & 1 != (j >> 1) & 1: nxt = (i & 2) | (j & 1) ndp[nxt][0] += B[i][0] * B[j][2] + B[i][2] * B[j][0] + 2 * B[i][1] * B[j][1]; ndp[nxt][0] %= mod ndp[nxt][1] += B[i][1] * B[j][2] + B[i][2] * B[j][1]; ndp[nxt][1] %= mod ndp[nxt][2] += B[i][2] * B[j][2]; ndp[nxt][2] %= mod B = ndp k >>= 1 Ans = 0 for i in range(4): Ans += ans[i][0]; Ans %= mod print(Ans)