結果

問題 No.3178 free sort
ユーザー ID 21712
提出日時 2025-06-22 13:09:33
言語 Go
(1.23.4)
結果
WA  
実行時間 -
コード長 782 bytes
コンパイル時間 11,685 ms
コンパイル使用メモリ 240,296 KB
実行使用メモリ 9,948 KB
最終ジャッジ日時 2025-06-22 13:09:57
合計ジャッジ時間 23,040 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 5
other WA * 40
権限があれば一括ダウンロードができます

ソースコード

diff #

package main

import . "fmt"

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 {
	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--
			}
		}
	}
	r := 1
	for _, c := range cs[1:] {
		r = r * c % Mod
	}
	return r
}
0