【ccf-csp题解】第0次csp认证-第四题-有趣的数-组合数学

题目描述

思路说明

本题涉及组合数学的知识

目的是在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种

所以总情况为:

\sum C(n-1,k)*(k-1)*(n-k-1) \left ( 1<=k<=n-2 \right )

满分代码

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值