結果

問題 No.3299 K-th MMA String
ユーザー ID 21712
提出日時 2025-10-11 11:35:52
言語 Go
(1.23.4)
結果
WA  
実行時間 -
コード長 1,407 bytes
コンパイル時間 11,856 ms
コンパイル使用メモリ 246,656 KB
実行使用メモリ 7,720 KB
最終ジャッジ日時 2025-10-11 11:36:07
合計ジャッジ時間 13,326 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample WA * 3
other WA * 20
権限があれば一括ダウンロードができます

ソースコード

diff #

package main

import . "fmt"

// 解説読んだけど分からん…
// 入力条件の上限と問題難易度のメタ読みから全列挙で間に合う可能性を考える方向性?
// 真面目な考察だと
// 先頭A,MA,MMで場合分け数え上げDPでK以上になったところからの復元で間に合うみたいな感じ?
// 合ってるか分からん…

func main() {
	var n,k int
	Scan(&n,&k)
	s:=make([]byte,n)
	for i:= range s {
		s[i]='A'
	}
	dp:=make([][3][2]int,n+1)
	const (
		A int = iota
		MA
		MM
	)
	const (
		ALL int = iota
		MMA
	)
	dp[n][A][ALL]=1
	dp[n][MM][ALL]=1
	count:=0
	p:=0
	for i:=n-1;i>=0;i-- {
		dp[i][A][ALL]=dp[i+1][A][ALL]+dp[i+1][MA][ALL]+dp[i+1][MM][ALL]
		dp[i][A][MMA]=dp[i+1][A][MMA]+dp[i+1][MA][MMA]+dp[i+1][MM][MMA]
		count+=dp[i][A][MMA]
		if count >= k {
			p=i+1
			break
		}
		dp[i][MA][ALL]=dp[i+1][A][ALL]
		dp[i][MA][MMA]=dp[i+1][A][MMA]
		count+=dp[i][MA][MMA]
		if count >= k {
			s[i-1]='M'
			p=i+1
			break
		}
		dp[i][MM][ALL]=dp[i+1][MA][ALL]+dp[i+1][MM][ALL]
		dp[i][MM][MMA]=dp[i+1][MA][ALL]+dp[i+1][MM][MMA]
		count += dp[i][MM][MMA]
		if count >= k {
			s[i+1]='M'
			p=i+1
			break
		}
	}
	for ;p<n;p++ {
		if count-dp[p][MM][MMA]<k {
			s[p-1]='M'
			s[p-2]='M'
			p++
			continue
		}
		count-=dp[p][MM][MMA]
		if count-dp[p][MA][MMA]<k {
			s[p-1]='M'
			p++
			continue
		}
		count-=dp[p][MA][MMA]
	}
	Println(string(s))
}
0