ACM部分排列组合公式&&hdu样例

前言:
每次比赛这道数学题涉及深一点的排列组合等数学公式,一时间就推不出来。

排列组合是数学中的一个分支,在计算机编程方面也有很多的应用,主要有排列公式和组合公式,错排公式、母函数、Catalan Number(卡特兰数)等。

一、有关组合数学的公式

在这里插入图片描述

1、排列公式   P(n,r)=n!/r!

2、组合公式   C(n,r)=n!/(r!*(n-r)!)  C(n,r)=C(n-1,r)+C(n-1,r-1)

3、错排公式   d[1]=0;   d[2]=1;

                       d[n]=(n-1)*(d[n-1]+d[n-2])

4、卡特兰数  

   前几项:1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786,208012…

                       公式       C(n)=C(2n,n)/(n+1)

5、母函数

在数学中,某个序列的母函数是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。使用母函数解决问题的方法称为母函数方法。
母函数可分为很多种,包括普通母函数、指数母函数、L级数、贝尔级数和狄利克雷级数。对每个序列都可以写出以上每个类型的一个母函数。构造母函数的目的一般是为了解决某个特定的问题,因此选用何种母函数视乎序列本身的特性和问题的类型。(百度百科)
母函数模板(针对n的分解):

/******************************
题目大意:求分解整数n的个数q(n)
例:
5 = 5;
5 = 4 + 1;
5 = 3 + 1 + 1;
5 = 3 + 2;
5 = 2 + 2 + 1;
5 = 2 + 1 + 1 + 1;
5 = 1 + 1 + 1 + 1 + 1;
sum(5) = 7;不区分顺序,
(3+2)与(2+3)为同一个
*******************************/
int main()
{
    int a[350],b[350],i,j,k,n;
    while(cin>>n&&n)
    {
        for(i=0;i<=n;i++){
            a[i]=1;
            b[i]=0;
        }
        for(i=2;i<=n;i++){
            for(j=0;j<=n;j++)
                for(k=0;k+j<=n;k+=i)
                    b[k+j]+=a[j];
            for(j=0;j<=n;j++){
                a[j]=b[j];
                b[j]=0;
            }
        }
        cout<<a[n]<<endl;
    }
    return 0;
}

二、STL中的全排列函数

函数声明:#include

bool next_permutation( iterator start, iterator end);

next_permutation()函数功能是输出所有比当前排列大的排列,顺序是从小到大。
prev_permutation()函数功能是输出所有比当前排列小的排列,顺序是从大到小。

三、自己定义的全排列的函数

void range(int a[],int k,int n){
    if(k==n) {
        for(int i=1;i<=n;i++){
            printf("%d",a[i]);
        }
        printf("\n");
    }
    for(int i=k;i<=n;i++){
        swap(a[k],a[i]);
        range(a,k+1,n);
        swap(a[k],a[i]);
    }

}

四、hdu题目样例

题目一、hdu1027 给出n,m,求n个数的按字典序排列的第m个序列

题目二、hdu1028 求一个正整数n的分解个数

题目三、hdu1171 给出一些物品的价值和个数,分成两份,是这两份的价值相差最小

题目四、hdu1261 给定若干字母和它们相应的个数,计算可以组成多少个不同的字符(高精度)

题目五、hdu1398 给出一个数字n,用给定的序列,求出组成n的所有种类

题目六、hdu1465 错排公式的应用

题目七、hdu1570 排列和组合公式的应用

题目八、hdu1716 有四张卡片,用这四张卡片能排列出很多不同的4位数,从小到大的顺序输出这些4位数

题目九、hdu1799 用递推公式求组合的个数

题目十、hdu1085 给出1、2、5的个数求出最小不连续的值

转载自:https://blog.csdn.net/fool_ran/article/details/40477915

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值