結果

問題 No.3300 Frog Game
コンテスト
ユーザー ID 21712
提出日時 2026-04-17 00:14:51
言語 Go
(1.26.1)
コンパイル:
env GOCACHE=/tmp go build _filename_
実行:
./Main
結果
AC  
実行時間 403 ms / 2,000 ms
コード長 2,567 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 10,392 ms
コンパイル使用メモリ 279,472 KB
実行使用メモリ 7,680 KB
最終ジャッジ日時 2026-04-17 00:15:17
合計ジャッジ時間 25,847 ms
ジャッジサーバーID
(参考情報)
judge3_0 / judge1_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 35
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

package main

import . "fmt"

var dump = false

func init() {
	check()
	// dump = true
	check2()
	check3()
	// dump = false
}

func main() {
	var n, a, b int
	Scan(&n,&a,&b)
	defer func() {
		if recover() != nil {
			if solve(n, a, b) {
				Println("sepa")
			} else {
				Println("ryota")
			}
		}	
	}()
	if dpsol(n, a, b) {
		Println("sepa")
	} else {
		Println("ryota")
	}
}

func solve(n, a, b int) bool {
	// 解法わからなかったので
	// 解説読んだ
	// だがわからない
	x := (n - 2) % (a + b)
	return (x >= b) || (x / a) % 2 == 1
}

func dpsol(n, a, b int) bool {
	if 1+a >= n {
		return false
	}
	dp := make([]int, n+a+1)
	for i := 0; i < a; i++ {
		dp[n-a+i] = 1
	}
	for i := n; i > 1; i-- {
		if dp[i] == 0 {
			continue
		}
		if i-a > 0 {
			dp[i-a] = max(dp[i-a], 3-dp[i])
		}
		if i-b > 0 {
			dp[i-b] = max(dp[i-b], 3-dp[i])
		}
	}
	if dump {
		println(Sprintf("n=%d,a=%d,b=%d,ans=%v", n,a,b,dp[1]==2))
		println(tostr(dp))
	}
	return dp[1] == 2
}

func tostr(dp []int) string {
	bs := make([]byte, len(dp))
	for i, v := range dp {
		bs[i] = byte(v+'0')
	}
	return string(bs)
}

func check() {
	ac, wa := 0, 0
	for n,m := 1, 2; n < 1e5; n,m = m,n+m {
		for a := 1; a <= 30 && a+1 < n; a++ {
			for b := a+1; b < n && b < a*30; b += a+1 {
				result := dpsol(n, a, b)
				answer := solve(n, a, b)
				if result == answer {
					ac++
				} else {
					wa++
					if wa == 1 {
						println(Sprintf("n=%d,a=%d,b=%d",n,a,b))
						println(Sprintf("result=%v", result))
						println(Sprintf("answer=%v", answer))
					}
				}
			}
		}
	}
	println(Sprintf("AC=%d,WA=%d",ac, wa))
}

func check2() {
	ns := []int{103}
	ac, wa := 0, 0
	for _, n := range ns {
		for a := 1; a < 12; a++ {
			for b := a+a; b < 10*a; b += a+a {
				result := dpsol(n, a, b)
				answer := solve(n, a, b)
				if result == answer {
					ac++
				} else {
					wa++
					if wa == 1 {
						println(Sprintf("n=%d,a=%d,b=%d",n,a,b))
						println(Sprintf("result=%v", result))
						println(Sprintf("answer=%v", answer))
					}
				}
			}
		}
	}
	println(Sprintf("AC=%d,WA=%d",ac, wa))
}

func check3() {
	ns := []int{103}
	ac, wa := 0, 0
	for _, n := range ns {
		for a := 1; a < 12; a++ {
			for b := a+a+a; b < 10*a; b += a+a {
				result := dpsol(n, a, b)
				answer := solve(n, a, b)
				if result == answer {
					ac++
				} else {
					wa++
					if wa == 1 {
						println(Sprintf("n=%d,a=%d,b=%d",n,a,b))
						println(Sprintf("result=%v", result))
						println(Sprintf("answer=%v", answer))
					}
				}			
			}
		}
	}
	println(Sprintf("AC=%d,WA=%d",ac, wa))
}
0