結果
問題 | No.2409 Strange Werewolves |
ユーザー |
|
提出日時 | 2023-08-27 11:11:19 |
言語 | Go (1.23.4) |
結果 |
AC
|
実行時間 | 31 ms / 2,000 ms |
コード長 | 3,172 bytes |
コンパイル時間 | 14,752 ms |
コンパイル使用メモリ | 221,412 KB |
実行使用メモリ | 26,496 KB |
最終ジャッジ日時 | 2024-12-27 04:06:30 |
合計ジャッジ時間 | 16,318 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 16 |
ソースコード
package mainimport ("bufio""fmt""os""sort""strconv")func Assert(ok bool) {if !ok {panic("assertion failed")}}var sc = func() *bufio.Scanner {sc := bufio.NewScanner(os.Stdin)sc.Split(bufio.ScanWords)return sc}()func Str() string {sc.Scan()return sc.Text()}func Int() int {x, _ := strconv.Atoi(Str())return x}func Float() float64 {x, _ := strconv.ParseFloat(Str(), 64)return x}var wr = bufio.NewWriter(os.Stdout)func Out(a ...interface{}) {fmt.Fprintln(wr, a...)}func Format(a []int) string {s := fmt.Sprint(a)return s[1 : len(s)-1]}func Chmin(a *int, b int) bool {if b < *a {*a = breturn true}return false}func Chmax(a *int, b int) bool {if b > *a {*a = breturn true}return false}func Max(a ...int) int {mx := a[0]for _, x := range a {if x > mx {mx = x}}return mx}func Min(a ...int) int {mn := a[0]for _, x := range a {if x < mn {mn = x}}return mn}func Sum(a ...int) int {s := 0for _, x := range a {s += x}return s}// truncatedfunc Divmod(a, b int) (int, int) {q := a / br := a - q*breturn q, r}func Lb(a []int, x int) int {n := len(a)f := func(i int) bool {return a[i] >= x}return sort.Search(n, f)}func Ub(a []int, x int) int {n := len(a)f := func(i int) bool {return a[i] > x}return sort.Search(n, f)}func Iota(n, v int) []int {a := make([]int, n)for i := 0; i < n; i++ {a[i] = v + i}return a}func YesNo(y, n string,) func(bool) {return func(f bool) {if f {Out(y)} else {Out(n)}}}var Yes = YesNo("Yes", "No")// var Yes = YesNo("yes", "no")// var Yes = YesNo("YES", "NO")func main() {defer wr.Flush()t := 1// t := Int()for ; t > 0; t-- {Solve()}}func Egcd(a, b int) (int, int, int) {if b == 0 {if a < 0 {return -a, -1, 0} else {return a, 1, 0}}q, r := Divmod(a, b)g, s, t := Egcd(b, r)return g, t, s - q*t}func Inv(m, a int) int {Assert(0 < a && a < m)g, x, _ := Egcd(a, m)Assert(g == 1)if x < 0 {x += m}return x}const mod = 998244353type Comb struct {F, Fi, Inv []int}// new(Comb).Init()func (c *Comb) Init(n int) *Comb {f := make([]int, n)fi := make([]int, n)iv := make([]int, n)f[0] = 1for i := 1; i < n; i++ {f[i] = f[i-1] * i % mod}fi[n-1] = Inv(mod,f[n-1])for i := n - 1; i >= 1; i-- {fi[i-1] = fi[i] * i % modiv[i] = fi[i] * f[i] % mod}c.F, c.Fi, c.Inv = f, fi, ivreturn c}func (c *Comb) P(n, k int) int {if k < 0 || n < k {return 0}return c.F[n] * c.Fi[n-k] % mod}func (c *Comb) C(n, k int) int {if k < 0 || n < k {return 0}return c.P(n, k) * c.Fi[k] % mod}func (c *Comb) H(n, k int) int {return c.C(n-1+k, k)}func (c *Comb) IP(n, k int) int {Assert(0 <= k && k <= n)return c.Fi[n] * c.F[n-k] % mod}func (c *Comb) IC(n, k int) int {return c.IP(n, k) * c.F[k] % mod}func Solve() {x := Int()y := Int()z := Int()w := Int()Chmax(&z, 1)Chmax(&w, 1)f := new(Comb).Init(1<<20)res := f.F[x+y-z-w]res *= f.C(x, z)res %= modres *= f.C(y, w)res %= modOut(res)}