AtCoder ABC172 E - NEQ(组合数 + 容斥原理)

题目链接:https://atcoder.jp/contests/abc172/tasks/abc172_e

题意:从mmm个数中选择分别选择nnn个数组合成两个序列A,BA,BA,B,满足Ai!=BiA_i != B_iAi!=Bi且每个序列都没有相同的数,问这样的序列一共有多少对。

思路:首先,我们可以考虑从mmm个数里面选择nnn个数,一共可以组成多少个序列,答案就是AmnA_m^nAmn,这样就相当于确定了AAA序列的个数。这样我们就可以知道BBB序列的个数就是从mmm个数里选择nnn个数,其中第iii个数不为iii的序列个数。
那该怎么求呢?这时候就可以用容斥原理啦!
iii个数不为iii的并集和 = 总数 - 一个数不为iii + 两个数不为iii - 三个数不为iii + …
这样答案就出来啦,具体实现详见代码。

AC代码:

#define _CRT_SECURE_NO_WARNINGS 1

#include <set>
#include <map>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <vector>
#include <cstdio>
#include <string>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

#define LL long long
#define pii pair<int,int>
#define sd(x) scanf("%d",&x)
#define slld(x) scanf("%lld",&x)
#define pd(x) printf("%d\n",x)
#define plld(x) printf("%lld\n",x)
#define rep(i,a,b) for(int i = (a) ; i <= (b) ; i++)
#define per(i,a,b) for(int i = (a) ; i >= (b) ; i--)
#define mem(a) memset(a,0,sizeof(a))
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
#define fast_io ios::sync_with_stdio(false)

const LL mod = 1e9 + 7;
const int maxn = 5e5 + 7;
const int INF = 0x3f3f3f3f;
const double pi = acos(-1.0);

LL f[maxn],inv[maxn];

void init() {
    inv[0] = f[0] = inv[1] = f[1] = 1;
    for(LL i = 2 ; i <= maxn ; i++) {
        inv[i] = ((mod - mod / i) * inv[mod%i]) % mod;
        f[i] = i;
    }
    for(LL i = 2 ; i <= maxn ; i++) {
        inv[i] = (inv[i] * inv[i-1]) % mod;
        f[i] = (f[i] * f[i-1]) % mod;
    }
}

LL C(LL x,LL y) {
    return f[x] * inv[y] % mod * inv[x-y] % mod;
}

LL A(LL x,LL y) {
    return f[x] * inv[x-y] % mod;
}
int main() {

#ifndef ONLINE_JUDGE
//	freopen("in.txt", "r", stdin);
//	freopen("out.txt", "w", stdout);
	long _begin_time = clock();
#endif

    init();
    int n,m;
    sd(n),sd(m);
    LL ans = A(m,n);
    for(LL i = 1 ; i <= n ; i++) {
        LL res = C(n,i) * A(m - i , n - i) % mod;
        if(i&1) ans = (ans - res + mod) % mod;
        else ans = (ans + res) % mod;
    }
    ans = ans * A(m,n) % mod;
    plld(ans);

#ifndef ONLINE_JUDGE
	long _end_time = clock();
	// cout << "time = " <<  _end_time - _begin_time << endl;
#endif
    return 0;
}
\[ \begin{cases} 2\sqrt{1 - \dfrac{2}{k + 2}} + \sqrt{1 - \dfrac{2}{k + m - 1}} + (\Delta - 1)\sqrt{1 - \dfrac{2}{k + \Delta - 1}} + (m - \Delta - 2)\sqrt{1 - \dfrac{2}{k + 1}}, & \Delta + 2 \leq m \leq \Delta + k - 1 \\[6pt] \sqrt{1 - \dfrac{2}{k + 2}} + \sqrt{1 - \dfrac{2}{2k + \Delta - 2}} + \sqrt{1 - \dfrac{2}{m - \Delta + 3}} + \\ (\Delta - 1)\sqrt{1 - \dfrac{2}{k + \Delta - 1}} + (m - \Delta - 2)\sqrt{1 - \dfrac{2}{k + 1}}, & \Delta + k \leq m \leq \Delta + 2k - 3 \\[6pt] \sqrt{1 - \dfrac{1}{k}} + \sqrt{1 - \dfrac{2}{2k + \Delta - 2}} + \sqrt{1 - \dfrac{2}{m - \Delta - k + 5}} + \\ (\Delta - 1)\sqrt{1 - \dfrac{2}{k + \Delta - 1}} + (m - \Delta - 2)\sqrt{1 - \dfrac{2}{k + 1}}, & \Delta + 2k - 2 \leq m \leq \Delta + 3k - 5 \\[6pt] 2\sqrt{1 - \dfrac{1}{k}} + x\sqrt{1 - \dfrac{2}{2k + \Delta - 2}} + \sqrt{1 - \dfrac{2}{m - k - xk + x + 3}} + (\Delta - x - 1)\sqrt{1 - \dfrac{2}{\Delta + k - 1}} + \\ (m - \Delta - 2k - 2)\sqrt{1 - \dfrac{2}{k + 1}}, & \Delta + 3k - 4 \leq m \leq \Delta + 3k - 5 + x(k - 1), \, 1 \leq x \leq \Delta - 1 \\[6pt] (y + 1)\sqrt{1 - \dfrac{1}{k}} + (y + 1)\sqrt{1 - \dfrac{2}{2k + \Delta - 2}} + (\Delta - y - 1)\sqrt{1 - \dfrac{2}{\Delta + k - 1}} + \sqrt{1 - \dfrac{2}{m - yk - \Delta k + y + 4}} + \\ (m - y - \Delta + 4)\sqrt{1 - \dfrac{2}{k + 1}}, & \Delta + 3k - 4 + (\Delta - 1)(k - 1) \leq m \leq \Delta + 3k - 5 + (\Delta - 1 + y)(k - 1), \, 1 \leq y \leq \Delta - 1 \\[6pt] (\Delta + z)\sqrt{1 - \dfrac{1}{k}} + \Delta\sqrt{1 - \dfrac{2}{\Delta + 2k - 2}} + \sqrt{1 - \dfrac{2}{m + z + \Delta - 2\Delta k - k + 3}} + (m + zk - 2\Delta - 2k - z - 1)\sqrt{1 - \dfrac{2}{k + 1}}, & \Delta + 3k - 4 + (2\Delta - 2)(k - 1) \leq m \leq \Delta + 3k - 5 + (2\Delta - 2 + z)(k - 1), \, z \geq 1 \\ \end{cases} \] \[ \begin{cases} 2\sqrt{1 - \dfrac{2}{k + 2}} + \sqrt{1 - \dfrac{2}{k + m - 1}} + (\Delta - 1)\sqrt{1 - \dfrac{2}{k + \Delta - 1}} + (m - \Delta - 2)\sqrt{1 - \dfrac{2}{k + 1}}, & \Delta + 2 \leq m \leq \Delta + k - 1 \\[6pt] \sqrt{1 - \dfrac{2}{k + 2}} + \sqrt{1 - \dfrac{2}{2k + \Delta - 2}} + \sqrt{1 - \dfrac{2}{m - \Delta + 3}} + \\ (\Delta - 1)\sqrt{1 - \dfrac{2}{k + \Delta - 1}} + (m - \Delta - 2)\sqrt{1 - \dfrac{2}{k + 1}}, & \Delta + k \leq m \leq \Delta + 2k - 3 \\[6pt] \sqrt{1 - \dfrac{1}{k}} + \sqrt{1 - \dfrac{2}{2k + \Delta - 2}} + \sqrt{1 - \dfrac{2}{m - \Delta - k + 5}} + \\ (\Delta - 1)\sqrt{1 - \dfrac{2}{k + \Delta - 1}} + (m - \Delta - 2)\sqrt{1 - \dfrac{2}{k + 1}}, & \Delta + 2k - 2 \leq m \leq \Delta + 3k - 5 \\[6pt] 2\sqrt{1 - \dfrac{1}{k}} + x\sqrt{1 - \dfrac{2}{2k + \Delta - 2}} + \sqrt{1 - \dfrac{2}{m - k - xk + x + 3}} + (\Delta - x - 1)\sqrt{1 - \dfrac{2}{\Delta + k - 1}} + \\ (m - \Delta - 2k - 2)\sqrt{1 - \dfrac{2}{k + 1}}, & \Delta + 3k - 4 \leq m \leq \Delta + 3k - 5 + x(k - 1), \, 1 \leq x \leq \Delta - 1 \\[6pt] (y + 1)\sqrt{1 - \dfrac{1}{k}} + (y + 1)\sqrt{1 - \dfrac{2}{2k + \Delta - 2}} + (\Delta - y - 1)\sqrt{1 - \dfrac{2}{\Delta + k - 1}} + \sqrt{1 - \dfrac{2}{m - yk - \Delta k + y + 4}} + \\ (m - y - \Delta + 4)\sqrt{1 - \dfrac{2}{k + 1}}, & \Delta + 3k - 4 + (\Delta - 1)(k - 1) \leq m \leq \Delta + 3k - 5 + (\Delta - 1 + y)(k - 1), \, 1 \leq y \leq \Delta - 1 \\[6pt] (\Delta + z)\sqrt{1 - \dfrac{1}{k}} + \Delta\sqrt{1 - \dfrac{2}{\Delta + 2k - 2}} + \sqrt{1 - \dfrac{2}{m + z + \Delta - 2\Delta k - k + 3}} + (m + zk - 2\Delta - 2k - z - 1)\sqrt{1 - \dfrac{2}{k + 1}}, & \Delta + 3k - 4 + (2\Delta - 2)(k - 1) \leq m \leq \Delta + 3k - 5 + (2\Delta - 2 + z)(k - 1), \, z \geq 1 \\ \end{cases} \] 修改这个分段函数的代码,让函数之间有间隔且内容不超过页面
最新发布
07-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值