ACWing 2206. 排队(数学 Java)

题目描述:
某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检。
他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的)
输入格式:
只有一行且为用空格隔开的两个非负整数 n 和 m,其含义如上所述。
输出格式:
仅包含一个非负整数,表示不同的排法个数。注意答案可能很大。
数据范围 0≤n,m≤2000
输入样例
1 1
输出样例:
12
题目链接:排队

分析:本题考数学的排列组合,结果非常大,long的数据范围都不够,可以直接用BigInteger来处理大数
思路:

  1. 把两个老师当作男生看待,然后去在他们之间(n+3个空位)插入女生。总方案为: A ( n + 2 , n + 2 ) ∗ A ( m , m ) ∗ C ( n + 3 , m ) A(n+2,n+2) * A(m,m) * C(n+3,m) A(n+2,n+2)A(m,m)C(n+3,m)
  2. 两个老师排在一起的情况方案为(把两个老师看成一个男生):
       A ( 2 , 2 ) ∗ A ( n + 1 , n + 1 ) ∗ A ( m , m ) ∗ C ( n + 2 , m ) A(2,2) * A(n+1,n+1) * A(m,m) * C(n+2,m) A(2,2)A(n+1,n+1)A(m,m)C(n+2,m)
  3. 用总方案减去两个老师排在一起的情况:
    A ( n + 2 , n + 2 ) ∗ A ( m , m ) ∗ C ( n + 3 , m ) − A ( 2 , 2 ) ∗ A ( n + 1 , n + 1 ) ∗ A ( m , m ) ∗ C ( n + 2 , m ) A(n+2,n+2) * A(m,m) * C(n+3,m) - A(2,2) * A(n+1,n+1) * A(m,m) * C(n+2,m) A(n+2,n+2)A(m,m)C(n+3,m)A(2,2)A(n+1,n+1)A(m,m)C(n+2,m)
    化简得到:
    在这里插入图片描述

代码:

import java.math.BigInteger;
import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt(), m = sc.nextInt();
		if (m>n+3||m+n==0) {	//没有合适方案的情况
			System.out.println(0);
			return;
		}
		BigInteger l = new BigInteger("1");//存左边公式的结果
		BigInteger r = new BigInteger("2");//存右边公式的结果
		for (int i = 1; i <= n+2; i++) // (n+2)!
			l = l.multiply(BigInteger.valueOf(i));
		for (int i = n+3; i > n+3-m; i--) //(n+2)!(n+3)!/(n+3-m)!
			l = l.multiply(BigInteger.valueOf(i));
		for (int i = 1; i <= n+1; i++) 	// 2*(n+1)!
			r = r.multiply(BigInteger.valueOf(i));
		for (int i = n+2; i > n+2-m; i--) // 2*(n+1)!(n+2)!/(n+2-m)!
			r = r.multiply(BigInteger.valueOf(i));
		System.out.println(l.subtract(r));//输出相减之后的结果
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Easenyang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值