CQXYM Count Permutations(思维)

题目链接:Problem - A - Codeforces

给我们一个n,让我们找满足题意的1~2*n的排列的个数,满足题意当且仅当对于一个任意的排列

a1,a2,……,an,有大于等于n个ai满足ai<ai+1。

分析:一个长度为2*n的排列,满足ai<ai+1的i最多有2*n-1个,最少有0个,区间 [0,n)和区间 [n,2*n-1]都具有n个元素,如果我们能证明满足ai<ai+1的i的个数出现在两个区间的排列数是一样的,那么我们就能够建立起1~2*n的全排列的个数与满足题意的排列个数之间的关系了。

下面来证明一下满足ai<ai+1的i的个数出现在两个区间的排列数是一样的。

对于排列a1,a2,……a2*n,不妨假设满足ai<ai+1的个数有k个,则容易知道对于排列

a2*n,……,a2,a1,满足ai<ai+1的个数有2*n-1-k个

若k属于区间 [0,n),则 2*n-1-k属于区间[n,2*n-1],反之

若k属于区间 [n,2*n-1],则 2*n-1-k属于区间 [0,n);

这样我们就可以证明满足ai<ai+1的i的个数出现在两个区间的排列数是一样的,也就是说我们直接求出1~2*n的全排列的个数再除以2即可得到答案。

下面是代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
const int mod=1e9+7;
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		long long ans=1;
		int n;
		scanf("%d",&n);
		for(int i=3;i<=2*n;i++)//从3开始就避免了除2 
			ans=ans*i%mod;
		printf("%lld\n",ans);
	}
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值