結果
問題 |
No.3299 K-th MMA String
|
ユーザー |
![]() |
提出日時 | 2025-10-11 08:39:27 |
言語 | Go (1.23.4) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,185 bytes |
コンパイル時間 | 12,033 ms |
コンパイル使用メモリ | 246,792 KB |
実行使用メモリ | 7,720 KB |
最終ジャッジ日時 | 2025-10-11 08:39:41 |
合計ジャッジ時間 | 13,329 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | WA * 3 |
other | WA * 20 |
ソースコード
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 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 { // TODO 復元 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 { // TODO 復元 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 { // TODO 復元 break } } Println(string(s)) }