第二题:T2染色
标签:数学、组合数学、乘法原理
题意:给定
n
n
n个点和每个点能染色的范围:
1
1
1到
a
i
a_i
ai之间的整数,求最终染色方案,答案对
1
0
9
+
7
10^9+7
109+7取模。
题解:比如样例中的
4
、
7
、
2
4、7、2
4、7、2,染色方案:
2
∗
(
4
−
1
)
∗
(
7
−
2
)
=
30
2*(4-1)*(7-2)=30
2∗(4−1)∗(7−2)=30。我们先给序列从小到大排下序,排完序之后,比如样例:
2
、
4
、
7
2、4、7
2、4、7,第一个点有
2
2
2种染色选择(
1
、
2
1、2
1、2);第二个点正常可以有
4
4
4种染色方案,但是第一个点占用了一种颜色,染色选择减一;同理,对于第三个点来说,被前两个点占用了两种颜色,染色选择减二,依此类推,通过乘法原理 最终就能求解了。过程中,记得通过同余定理对模数取模。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
ll a[300005], ans = 1;
int main() {
ll n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
sort(a + 1, a + 1 + n);
for (int i = 1; i <= n; i++) {
ans = ans * (a[i] - i + 1) % mod;
}
cout << ans << endl;
return 0;
}