题目描述
思路说明
本题涉及组合数学的知识
目的是在n个空位上放置0、1、2、3,问符合题意的放法有多少种
首先注意到一个重要的事实:
只要0和1的位置已经确定,那么2和3的摆放就十分容易了
那么把所有情况分为n-2种:
第一种:0和1的总数为2个,2和3的总数为n-2个
第二种:0和1的总数为3个,2和3的总数为n-3个
......
第k种:0和1的总数为k个,2和3的总数为n-k个
......
第n-2种:0和1的总数为n-2个,2和3的总数为2个
只需要把每一种算出来,最后求和即可
对于第k种:
对于n个空位,因为第一个数字不能为0,所以要先将后n-1个空位中放入这k个01,总方案数:
C(n-1,k)
对于这k个01内部,0必定在1前面,所以总情况只有k-1种:
第一种:01111....111(k-1个1)
第二种:00111....111(k-2个1)
.......
第k-1种:00.....0001
对于12内部,总情况同理只有n-k-1种
所以总情况为:
满分代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=1010,MOD=1e9+7;
int C[N][N];
int main()
{
int n;
cin>>n;
for(int i=0;i<=n;i++)
for(int j=0;j<=i;j++)
if(!j)C[i][j]=1;
else C[i][j]=(C[i-1][j-1]+C[i-1][j])%MOD;
int res=0;
for(int i=2;i<=n-2;i++)
res=(res+(LL)C[n-1][i]*(i-1)*(n-i-1))%MOD;
cout<<res;
return 0;
}