結果
問題 |
No.3178 free sort
|
ユーザー |
![]() |
提出日時 | 2025-06-22 13:27:41 |
言語 | Go (1.23.4) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,201 bytes |
コンパイル時間 | 13,114 ms |
コンパイル使用メモリ | 255,008 KB |
実行使用メモリ | 12,004 KB |
最終ジャッジ日時 | 2025-06-22 13:28:07 |
合計ジャッジ時間 | 25,395 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | WA * 40 |
ソースコード
package main import . "fmt" import . "slices" const Mod = 998244353 func main() { var n string Scan(&n) ds := make([]int, 10) for _, ch := range n { ds[int(ch)-'0']++ } xs := make([]int, len(n)+1) for i := range xs { for _, d := range ds { if i <= d { xs[i]++ } } } ans := calc(len(n), xs) if ds[0] > 0 { xs[ds[0]]-- ans += Mod - calc(len(n)-1, xs) ans %= Mod } Println(ans) } func calc(n int, xs []int) int { xs = Clone(xs) cs := make([]int, n+1) for i := range cs { cs[i] = i } for i := range xs { j := len(xs)-1 - i if j == 0 { break } x := xs[j] m := n / j for k := m; x > 0 && k >= 1; k-- { for x > 0 && cs[k*j] % j == 0 { cs[k*j] /= j x-- } } xs[j] = x } ps := make([]int, n+1) for _, c := range cs { if c > 1 { ps[c]++ } } for i, p := range ps { if i < 2 || p == 0 { continue } for j := i; p > 0 && j < len(cs); j += i { for p > 0 && cs[j] > 0 { cs[j]-- t := j for p > 0 && t % i == 0 { t /= i p-- } if t > 1 { cs[t]++ } } } } r := 1 for i, p := range ps { if i == 0 { continue } for p > 0 { r = r * i % Mod p-- } } return r }