結果

問題 No.3178 free sort
ユーザー ID 21712
提出日時 2025-06-22 14:38:06
言語 Go
(1.23.4)
結果
AC  
実行時間 254 ms / 2,000 ms
コード長 798 bytes
コンパイル時間 12,824 ms
コンパイル使用メモリ 246,916 KB
実行使用メモリ 9,948 KB
最終ジャッジ日時 2025-06-22 14:38:32
合計ジャッジ時間 24,391 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 5
other AC * 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 {
	ps := make([]bool, n+1)
	ps[0],ps[1] = true, true
	cs := make([]int, n+1)
	for i := range ps {
		if ps[i] {
			continue
		}
		for j := i; j < len(ps); j += i {
			ps[j] = true
			cnt := 0
			for t := j; t % i == 0; t /= i {
				cnt++
			}
			cs[i] += cnt * (1 - xs[j])
		} 
	}
	r := 1
	for i, c := range cs {
		for ; c > 0; c-- {
			r = r * i % Mod
		}
	}
	return r
}
0