1. 程式人生 > >洛谷——P1375 小貓

洛谷——P1375 小貓

include str 復制 輸入 sed -s ide 技術分享 div

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 小貓