[codeforces 1284C] New Year and Permutation 组合数学

[codeforces 1284C] New Year and Permutation 组合数学

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址https://codeforces.com/contest/1284/problem/C

Problem Lang Verdict Time Memory
C - New Year and Permutation GNU C++11 Happy New Year! 31 ms 1800 KB

此文https://blog.csdn.net/qq_43326267/article/details/103843503思路不错,摘抄如下

Sol

这个题很有意思呀。就是给你一个n,求n的所有排列里区间左右端点的差等于区间内极差的区间的和。

其实手枚一下就可以发现,其实满足这个条件的区间内的数一定是连续的。

所以我们从区间长度入手,对于每个长度的区间看对应了多少个排列满足要求。

这就很简单了呀。我们枚举区间的极差i,考虑选差值为i的i+1个数有n-i种选法,区间内的顺序随意,整体看这i+1个数为一组,另外的n-i-1个数为n-i-1个组,这n-i个组的顺序同样随意(不是n-i-1个组吗,怎么变成n-i个组了?你这一坨区间也算一个组啊)。

所以就有:

然后这个题就没了。

#include <stdio.h>
#define LL long long
#define maxn 250010
LL fact[maxn],ans=0;
int main(){
	int i,n,m;
	scanf("%d%d",&n,&m);
	fact[0]=1;
	for(i=1;i<=n;i++)fact[i]=fact[i-1]*i%m;
	for(i=0;i<=n-1;i++)ans=(ans+(n-i)*fact[i+1]%m*fact[n-i]%m)%m;
	printf("%lld\n",ans);
	return 0;
}
发布了475 篇原创文章 · 获赞 509 · 访问量 42万+

猜你喜欢

转载自blog.csdn.net/mrcrack/article/details/103846569