算法竞赛训练指南2.1 计数方法

Posted jkzr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法竞赛训练指南2.1 计数方法相关的知识,希望对你有一定的参考价值。

1.  O(n)方法求C(n,m)

    利用公式C(n,k+1)=C(n,k)*(n-k)/(k+1)

    模板:

#include <iostream>
#include <algorithm>
using namespace std;
typedef unsigned long long LL;
const int maxn=100005;
LL n,m;
LL C()
{
    if(m==0||n==m)
        return 1;
    if(m>n-m)
        m=n-m;
    LL ans,temp=1;
    for(LL i=1;i<=m;i++)
    {
        ans=temp*(n-i+1)/i;
        temp=ans;
    }
    return ans;
}
int main()
{
    ios::sync_with_stdio(false);
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n>>m;
        cout<<C()<<endl;
    }
    return 0;
}

2.  有重复元素的全排列,有k个元素,其中第i个元素有ni个,求全排列的个数

    见白书的细致讲解,书上面说的更清楚。

3.  可重复的选取的组合,有n个不同的元素,每个元素可以选多次,一共选k个元素,有多少种方法。

    想法:设第i个元素选xi个,问题就转化为了x1+x2+x3+...+xn=k的非负整数解有多少个,就相当于把k个元素分为n组,那么只需要再这些元素中插入n-1个板,然后再n-1+k当中找这n-1块板,那么结果就是C(n+k-1,n-1)=C(n-1+k,k);

4.  单色三角形:给定n个点,且没有三色共线,每两个点之间都用黑色或者红色的线段连接,求3条边同色的三角形数。

    想法:求同色的可以先求不同色的,每个非单色的三角形中,恰好有两个顶点连接两条异色边,而且有一个公共点的两条异色边总是唯一对应一个非单色三角形,因此如果第i个点连接了ai条红边,n-1-ai条黑边,则这些边属于ai*(n-1-ai)个非单色的三角形,每个非单色的三角形选了两次故还需要除以2,这样同色的也就求出来了。

 

    

以上是关于算法竞赛训练指南2.1 计数方法的主要内容,如果未能解决你的问题,请参考以下文章

算法竞赛入门经典训练指南pdf高清版免费下载

算法竞赛入门经典训练指南-做题详细记录(更新中)

算法竞赛训练指南11.2 最小生成树

算法竞赛入门经典-训练指南(10881-Piotr's Ants)

《算法竞赛进阶指南》0x5C计数DP Gerald & Giant Chess

《算法竞赛进阶指南》0x5C计数类DP AcWing307n个点的连通无向图数量