题目描述:
CF1581A CQXYM Count Permutations
思路:
问你有多少 1 到 2n 的排列满足
a
i
a_i
ai
<
<
<
a
i
+
1
a_{i+1}
ai+1个数
≥
\ge
≥
n
n
n。
因为对于一个满足
a
i
a_i
ai
<
<
<
a
i
+
1
a_{i+1}
ai+1个数
≥
\ge
≥
n
n
n 的
1
1
1 到
2
n
2n
2n 的排列
a
a
a,
我们取
b
i
b_i
bi=
2
n
2n
2n
−
-
−
a
i
a_i
ai
+
+
+
1
1
1
那么
b
b
b 是一个满足
a
i
a_i
ai
<
a
i
+
1
<a_{i+1}
<ai+1个数
<
<
<
n
n
n 的
1
1
1 到
2
n
2n
2n。
且所有满足
a
i
a_i
ai
<
<
<
a
i
+
1
a_{i+1}
ai+1个数
≥
\ge
≥ n 的
1
1
1 到
2
n
2n
2n 的排列与 满足
a
i
a_i
ai
<
<
<
a
i
+
1
a_{i+1}
ai+1个数
<
<
<
n
n
n 的
1
1
1 到
2
n
2n
2n 的排列一一映射。
因此满足
a
i
a_i
ai
<
<
<
a
i
+
1
a_{i+1}
ai+1
个数
≥
\ge
≥ n 的
1
1
1 到
2
n
2n
2n 的排列个数就是
1
1
1 到
2
n
2n
2n 的排列个数的一半。
1
1
1 到
2
n
2n
2n 的排列个数就是
(
2
n
)
!
(2n)!
(2n)!。
因此答案为
(
2
n
)
!
2
\dfrac{(2n)!}{2}
2(2n)!
一定要注意模的值,是
1
0
9
10^9
109
+
+
+
7
7
7
(我第一次写成了
1
0
8
10^8
108
+
+
+
7
7
7,当场0pts…)
贴AC代码:
#include<bits/stdc++.h>
using namespace std;
long long ans(long long n){
long long sum=1;
for(long long i=3;i<=2*n;i++)
sum=sum*i%1000000007;
return sum;
}
long long t,n;
int main(){
scanf("%lld",&t);
for(long long i=1;i<=t;i++){
scanf("%lld",&n);
printf("%lld\n",ans(n));
}
return 0;
}