A - Leyland Number
問題
正整数
A,B が与えられます。
$A^B+B^A$の値を出力してください。
制約
- $2≤A≤B≤9$
- 入力される数値はすべて整数
詳細はこちらです。
解説
【フローチャート】
入力に従い$A^B+B^A$を計算します。
プログラム例
program abc320a
implicit none
integer A, B, Ans
read (*, *) A, B
Ans = A**b+B**A
write(*,*)Ans
end program abc320a
B - Longest Palindrome
問題
文字列$S$が与えられます。 $S$の連続する部分文字列のうち、回文であるものの長さの最大値を求めてください。
制約
- $S$は長さ$2$以上$100$以下の英大文字からなる文字列
詳細はこちらです。
解説
【フローチャート】
【補足】
※1
回文の検証に使用したい範囲を超過していないかを判定します。
入力する文字列の長さは1〜100文字なので、格納用の配列$S$は100文字分用意しています。
入力時に余った部分は空白が入ります。
回文の検証に使用したい範囲は文字が格納されている箇所までなので、
$S(i:i)$に空白が格納されている時点で処理を終了させます。
※2
回文が成立しているかを判定します。
判定は、$S(i:i)$ を中心に置き、そこから左右に1文字ずつ文字が一致しているかを調べます。
判定する順番のイメージ
$4,3,2,1,S(i:i),1,2,3,4$
※3
回文が成立している最大の長さを更新します。
最大値の比較にはMAX関数を使用します
※4
回文の検証に使用したい範囲を超過していないかを判定します。
回文の検証に使用したい範囲は文字が格納されている箇所までなので、
$S(i:i)とS(i+1:i+1)$に空白が格納されている時点で処理を終了させます。
※5
回文が成立しているかを判定します。
判定は、中心に文字を置かずに、左右に1文字ずつ文字が一致しているかを調べます。
判定する順番のイメージ
$4,3,2,1,1,2,3,4$
プログラム例
program abc320b
implicit none
integer i, j, length, cnt
character(100) S
!読み込み
read (*, *) S
!回文の長さ測定
length = 1
do i = 1, len(S)
cnt = 1
if (S(i:i) == '') exit
do j = 1, len(S)
if (i - j < 1 .or. i + j > len(S)) exit
if (S(i - j:i - j) /= S(i + j:i + j)) exit
cnt = cnt + 2
end do
length = max(length, cnt)
if (S(i:i) == S(i + 1:i + 1)) then
cnt = 2
else
cycle
end if
do j = 1, len(S)
if (i - j < 1 .or. i + j + 1 > len(S)) exit
if (S(i - j:i - j) /= S(i + j + 1:i + j + 1)) exit
cnt = cnt + 2
end do
length = max(length, cnt)
end do
!結果の出力
write (*, '(i0)') length
end program abc320b
C - Slot Strategy 2 (Easy)
問題
数字のみで構成される長さ M のリールが 3 個からなるスロットがあります。
スロットが回り始めてからちょうど t 秒後にボタンを 1 つ選んで押す、または何もしないことができます。
ボタンを押した場合は $mod(t,M)+1$ 文字目を表示して止まります。
全てのリールを同じ数字で止めるためには、最小で何秒かかるかを求めてください。
制約
- $1≤M≤100$
- M は整数
- S_iは数字のみからなる長さ M の文字列
詳細はこちらです。
解説
【フローチャート】
【補足】
※1
リールを止める時間は mod により制御されるため、M 秒で結果が1周します。
M+1 秒以降は調べる必要はありません。
1 つのリールと止める時間の最大は 100秒(M=100)なので、0〜300 秒まで調べれば3つのリールの全てのパターンを調べることができます。
※2
1度に止められるリールは1つです。
同時に複数のリールを止めることはないので、$t1=t2,t2=t3,t1=t3$の時はcycle文により処理を飛ばします。
※3
全てのリールが一致している場合、経過時間の最小時間を更新します。
経過時間は t1 , t2 , t3 のうち、一番最後に止めた時間になります。
プログラム例
program abc320c
implicit none
integer M, t1, t2, t3, tmp(3), ans
character(:), allocatable:: S(:)
character(1) slot(3)
!読み込み
read (*, *) M
allocate (character(M):: S(3))
read (*, *) S(1)
read (*, *) S(2)
read (*, *) S(3)
!スロットを回す
ans = 777777777
do t1 = 0, 300
tmp(1) = mod(t1, M) + 1
slot(1) = S(1) (tmp(1):tmp(1))
do t2 = 0, 300
if (t1 == t2) cycle
tmp(2) = mod(t2, M) + 1
slot(2) = S(2) (tmp(2):tmp(2))
if (slot(1) /= slot(2)) cycle
do t3 = 0, 300
if (t1 == t3) cycle
if (t2 == t3) cycle
tmp(3) = mod(t3, M) + 1
slot(3) = S(3) (tmp(3):tmp(3))
if (slot(2) /= slot(3)) cycle
ans = min(ans, max(t1, t2, t3))
end do
end do
end do
!結果の出力
if (ans == 777777777) then
write (*, '(i0)') - 1
else
write (*, '(i0)') ans
end if
end program abc320c
感想
- 回文の問題に苦戦しました。苦手なので回文用のサブルーチンを作っておきたい。

