[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;
}