結果

問題 No.314 ケンケンパ
ユーザー LeonardoneLeonardone
提出日時 2015-12-08 00:52:45
言語 Ruby
(3.3.0)
結果
AC  
実行時間 248 ms / 1,000 ms
コード長 2,737 bytes
コンパイル時間 243 ms
コンパイル使用メモリ 11,216 KB
実行使用メモリ 15,396 KB
最終ジャッジ日時 2023-10-12 20:26:37
合計ジャッジ時間 3,714 ms
ジャッジサーバーID
(参考情報)
judge14 / judge13
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 243 ms
15,116 KB
testcase_01 AC 79 ms
15,184 KB
testcase_02 AC 79 ms
15,188 KB
testcase_03 AC 81 ms
15,180 KB
testcase_04 AC 81 ms
15,144 KB
testcase_05 AC 81 ms
15,260 KB
testcase_06 AC 80 ms
15,144 KB
testcase_07 AC 80 ms
15,224 KB
testcase_08 AC 81 ms
15,076 KB
testcase_09 AC 81 ms
15,040 KB
testcase_10 AC 81 ms
15,264 KB
testcase_11 AC 80 ms
15,184 KB
testcase_12 AC 80 ms
15,084 KB
testcase_13 AC 83 ms
15,176 KB
testcase_14 AC 83 ms
15,252 KB
testcase_15 AC 83 ms
15,160 KB
testcase_16 AC 86 ms
15,244 KB
testcase_17 AC 98 ms
15,368 KB
testcase_18 AC 161 ms
15,188 KB
testcase_19 AC 248 ms
15,396 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
Syntax OK

ソースコード

diff #

#! ruby
# yukicoder My Practice
# author: Leonardone @ NEETSDKASU

# 解説読後
# http://yukicoder.me/problems/882/editorial

=begin

解説がACコード読めとあったので
ACのコードをいくつか読んで

要は
ある時点で「パ」の状態で終わっているパターン数
ある時点で「ケン」の状態で終わっているパターン数
ある時点で「ケンケン」の状態で終わっているパターン数
これを動的計画法とやらでNの小さいほうから積み重ねていく感じらしい(?)
そしてこの3種のパターン数の和が求める答えとなるということらしい

初期値 N=1として
A[1] = 0 「パ」で終わっている状態
B[1] = 1 「ケン」で終わっている状態
C[1] = 0 「ケンケン」で終わっている状態

N=2では
N=1で「パ」で終わっているパターンは次は「ケン」に
N=1で「ケン」で終わっているパターンは「パ」か「ケンケン」に
N=1で「ケンケン」で終わっているパターンは「パ」に
つまり
「パ」で終わる       A[2] = B[1] + C[1] = 1 + 0 = 1
「ケン」で終わる     B[2] = A[1] = 0
「ケンケン」で終わる C[2] = B[1] = 1

N=3では同様に
N=2で「パ」で終わっているパターンは次は「ケン」に
N=2で「ケン」で終わっているパターンは「パ」か「ケンケン」に
N=2で「ケンケン」で終わっているパターンは「パ」に
つまり
「パ」で終わる       A[3] = B[2] + C[2] = 0 + 1 = 1
「ケン」で終わる     B[3] = A[2] = 1
「ケンケン」で終わる C[3] = B[2] = 0

これを繰り返していけば答えが求まるということに

一般化すると
A[N + 1] = B[N] + C[N]
B[N + 1] = A[N]
C[N + 1] = B[N]

んで答えは answer = A[N] + B[N] + C[N]

「パ」で終わる部分だけ和で求めるので桁が増えすぎないように mod 100000007 を行うと
つまり
A[N + 1] = (B[N) + C[N]) mod 100000007

当然答えもmod 100000007 しておくべき

answer = (A[N] + B[N] + C[N]) mod 100000007

=end


n = gets.to_i

MD = (10 ** 9) + 7

a = 0 # n=1で「パ」で終わるパターン数
b = 1 # n=1で「ケン」で終わるパターン数
c = 0 # n=1で「ケンケン」で終わるパターン数


2.upto(n) do
    
    # ta は A[N+1]、 aは A[N]
    # tb は B[N+1]、 bは B[N]
    # tc は C[N+1]、 cは C[N]
    
    ta = (b + c) % MD  # 次に「パ」で終わるパターン数
    tb = a             # 次に「ケン」で終わるすパターン数
    tc = b             # 次に「ケンケン」で終わるパターン数
    
    a, b, c = ta, tb, tc  # パターン数の更新
    
end

p (a + b + c) % MD


0