一.题目链接
二.思路
思路参考:https://www.acwing.com/solution/content/24436/
三.代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int mod = 100003;
const int N = 2050;
int fact[N], infact[N];
int a, b, c, d, k;
//快速幂求逆元
int qmi(int a, int b)
{
int res = 1;
while(b)
{
if(b & 1) res = (LL)res * a % mod;
a = (LL)a * a % mod;
b >>= 1;
}
return res;
}
int C(int a, int b)
{
if(a < b) return 0;
return (LL)fact[a] * infact[a - b] % mod * infact[b] % mod;
}
int P(int a, int b)
{
if(a < b) return 0;
return (LL)fact[a] * infact[a - b] % mod;
}
int main()
{
cin >> a >> b >> c >> d >> k;
//预处理阶乘和阶乘的逆
fact[0] = infact[0] = 1;
for(int i = 1; i < N; i ++)
{
fact[i] = (LL)fact[i - 1] * i % mod;
infact[i] = (LL)infact[i - 1] * qmi(i, mod - 2) % mod;
}
LL res = 0;
for(int i = 0; i <= k; i ++)
{
res = (res + (LL)C(b, i) * P(a, i) % mod * C(d, k - i) % mod * P(a + c - i, k - i)) % mod;
}
cout << res << endl;
return 0;
}
四.总结
- 对于一个规则的图形,若要放置n个物品,可以直接求
C
a
n
∗
P
b
n
C^n_a*P^n_b
Can∗Pbn。
对于一个不规则的图形来说,需要将其化为规则的图形在计算,比如本题。