結果
| 問題 |
No.3178 free sort
|
| コンテスト | |
| ユーザー |
ID 21712
|
| 提出日時 | 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
}
ID 21712