洛谷——P1375 小猫

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷——P1375 小猫相关的知识,希望对你有一定的参考价值。

P1375 小猫

题目描述

有2n只小猫站成一圈,主人小明想把它们两两之间用绳子绑住尾巴连在一起。同时小明是个完美主义者,不容许看到有两根绳子交叉。请问小明有几种连线方案,可以把让所有小猫两两配对?

方案数很大,仅需输出方案数模1000000007(一个质数)的值。

数据范围:

60% N<=100

100% N<=100000

输入输出格式

输入格式:

 

输入一个整数n

 

输出格式:

 

输出方案数对1000000007取模的值

 

输入输出样例

输入样例#1: 复制
3
输出样例#1: 复制
5
卡特兰数
这个题可以很快的将她转化成一个有2*n个点的圆,要在上面接n条边,求方案数
卡特兰数递推式
技术分享图片
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 100010
#define mod 1000000007
using namespace std;
int n,a,b,c,h[N],gcd;
int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}
    while(ch>=0&&ch<=9) x=x*10+ch-0,ch=getchar();
    return x*f;
}
int main()
{
    n=read();
    h[0]=h[1]=1;
    for(int i=2;i<=n;i++)
     for(int j=1;j<=i;j++)
      h[i]=(1ll*h[j-1]*h[i-j]%mod+h[i]%mod)%mod; 
    printf("%d",h[n]);
    return 0;
}
80分

AC代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 100010
#define LL long long
#define mod 1000000007
using namespace std;
LL n,ans,f[N*2];
LL read()
{
    LL x=0,f=1; char ch=getchar();
    while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}
    while(ch>=0&&ch<=9) x=x*10+ch-0,ch=getchar();
    return x*f;
}
LL Mi(LL a,LL b,int p)
{
    LL res=1;
    while(b)
    {
        if(b&1) res=res*a%p;
        b>>=1;a=a*a%p;
    }return res;
}
LL C(LL n,LL m,int p)
{
    if(m>n)return 0;
    return  f[n]*Mi(f[m]*f[n-m]%p,p-2,p)%p;
}
LL Lus(LL n,LL m,int p)
{
    if(m==0) return 1;
    return (C(n%p,m%p,p)*Lus(n/p,m/p,p))%p;
}
int main()
{
    n=read();f[0]=1;
    for(int i=1;i<=2*n;i++) f[i]=1ll*f[i-1]*i%mod;
    ans=(Lus(2*n,n,mod)-Lus(2*n,n+1,mod)+mod)%mod;
    printf("%lld",ans);
    return 0;
}

 

 

以上是关于洛谷——P1375 小猫的主要内容,如果未能解决你的问题,请参考以下文章

P1375 小猫(二飞的小憨猫)

洛谷——P1361 小猫爬山

洛谷 P1361 小猫爬山

洛谷 P1361 小猫爬山

vijos P1375 大整数(高精不熟的一定要做!)

页面404圈小猫游戏代码