結果

問題 No.2409 Strange Werewolves
ユーザー い
提出日時 2023-08-27 11:09:35
言語 Go
(1.22.1)
結果
AC  
実行時間 50 ms / 2,000 ms
コード長 3,198 bytes
コンパイル時間 15,294 ms
コンパイル使用メモリ 205,160 KB
実行使用メモリ 28,728 KB
最終ジャッジ日時 2023-08-27 11:09:52
合計ジャッジ時間 15,295 ms
ジャッジサーバーID
(参考情報)
judge15 / judge11
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 49 ms
28,728 KB
testcase_01 AC 49 ms
28,728 KB
testcase_02 AC 50 ms
28,728 KB
testcase_03 AC 49 ms
28,724 KB
testcase_04 AC 49 ms
28,728 KB
testcase_05 AC 49 ms
28,724 KB
testcase_06 AC 49 ms
28,724 KB
testcase_07 AC 50 ms
28,724 KB
testcase_08 AC 49 ms
28,728 KB
testcase_09 AC 50 ms
28,728 KB
testcase_10 AC 49 ms
28,728 KB
testcase_11 AC 49 ms
28,728 KB
testcase_12 AC 49 ms
28,724 KB
testcase_13 AC 49 ms
28,724 KB
testcase_14 AC 49 ms
28,724 KB
testcase_15 AC 49 ms
28,724 KB
testcase_16 AC 50 ms
28,728 KB
testcase_17 AC 49 ms
28,724 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

package main

import (
	"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 = b
		return true
	}
	return false
}

func Chmax(a *int, b int) bool {
	if b > *a {
		*a = b
		return 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 := 0
	for _, x := range a {
		s += x
	}
	return s
}

// truncated
func Divmod(a, b int) (int, int) {
	q := a / b
	r := a - q*b
	return 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 = 998244353

type Comb struct {
	m          int
	F, Fi, Inv []int
}

// new(Comb).Init()
func (c *Comb) Init(m, n int) *Comb {
	c.m = m
	f := make([]int, n)
	fi := make([]int, n)
	iv := make([]int, n)
	f[0] = 1
	for i := 1; i < n; i++ {
		f[i] = f[i-1] * i % m
	}
	fi[n-1] = Inv(m, f[n-1])
	for i := n - 1; i >= 1; i-- {
		fi[i-1] = fi[i] * i % m
		iv[i] = fi[i] * f[i] % m
	}
	c.F, c.Fi, c.Inv = f, fi, iv
	return c
}

func (c *Comb) P(n, k int) int {
	if k < 0 || n < k {
		return 0
	}
	return c.F[n] * c.Fi[n-k] % c.m
}

func (c *Comb) C(n, k int) int {
	if k < 0 || n < k {
		return 0
	}
	return c.P(n, k) * c.Fi[k] % c.m
}

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] % c.m
}

func (c *Comb) IC(n, k int) int {
	return c.IP(n, k) * c.F[k] % c.m
}

func Solve() {
	x := Int()
	y := Int()
	z := Int()
	w := Int()
	Chmax(&z, 1)
	Chmax(&w, 1)
	f := new(Comb).Init(mod, 1<<20)
	res := f.F[x+y-z-w]
	res *= f.C(x, z)
	res %= mod
	res *= f.C(y, w)
	res %= mod
	Out(res)
}
0