洛谷——P1375 小貓
阿新 • • 發佈:2017-11-26
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();} while80分(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; }
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 小貓