首页 > 试题广场 >

视力表

[编程题]视力表
  • 热度指数:1859 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小强今天体检,其中有一个环节是测视力
小强看到的视力表是一张的表格,但是由于小强视力太差,他无法看清表格中的符号。不过热爱数学的他给自己出了这样一个问题:假设现在有a个向上的符号,b个向下的符号,c个向左的符号,d个向右的符号,把这些符号填到视力表中,总共有多少种可能的情况呢?

输入描述:
第一行输入五个数N, a, b, c, d
保证


输出描述:
输出一个数字,表示答案
由于结果可能很大,只需输出对998244353取模之后的结果即可
示例1

输入

2 3 1 0 0

输出

4

说明

共有如下四种情况

上上    上上
上下    下上

上下    下上
上上    上上
示例2

输入

2 2 1 1 0

输出

12
示例3

输入

2 1 1 1 1

输出

24

备注:
数据保证,且
对于的数据,N = 2
对于的数据, 
对于的数据,
对于的数据,
题目没说范围,不如直接不讲武德使用BigInteger吧~
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.Arrays;


public class Main {
    static int mod = 998244353;

    public static void main(String[] args) throws InterruptedException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int[] s = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        int N = s[0];
        int a = s[1];
        int b = s[2];
        int c = s[3];
        BigInteger t = cal(N * N - a - b - c + 1, N * N);
        BigInteger ka = cal(1, a);
        BigInteger kb = cal(1, b);
        BigInteger kc = cal(1, c);
        t = t.divide(ka.multiply(kb.multiply(kc)));
        t = t.mod(new BigInteger(mod + ""));
        System.out.println(t.toString());
    }

    public static BigInteger cal(int a, int b) {
        BigInteger t = new BigInteger(1 + "");
        for (int i = a; i <= b; i++) {
            t = t.multiply(new BigInteger(i + ""));
        }
        return t;
    }
}


发表于 2022-08-14 22:42:15 回复(0)