题意:N道题连线,问至少前k道题目错误的可能有几种
思路:那就是所有连线可能的情况数(即n!) 减去前k道题存在正确答案的情况数
根据容斥原理,奇数个集合为正,偶数个集合为负计算即可
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1e14 + 7;
const int N = 1e5 + 10;
int n, k;
int main()
{
int t, cas;
scanf("%d", &t);
while(t--)
{
scanf("%d%d%d", &cas, &n, &k);
ll ans = 1;
for(int i = 1; i <= n; i++) ans *= i;
ll cnt = 0;
for(int i = 1; i <= k; i++)
{
ll tmp = 1;
for(int j = k; j > k - i; j--)
{
tmp *= j;
}
for(int j = i; j > 1; j--)
{
tmp /= j;
}
for(int j = n - i; j >= (n - k + 1); j--) tmp *= j;
if(i % 2 == 0) cnt -= tmp;
else cnt += tmp;
}
for(int i = n - k; i > 1; i--) cnt *= i;
ans -= cnt;
printf("%d %lld\n", cas, ans);
}
return 0;
}
/*
4
1 4 1
2 7 3
3 10 5
4 17 17
*/