結果

問題 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
権限があれば一括ダウンロードができます

ソースコード

diff #

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
}
0