【HNOI模拟By YMD】move
Description
設P(n)為從(0,0)移動到點(n,0)的不同路徑數目,移動的方式有以下三種:(x,y)->(x+1,y-1),(x,y)->(x+1,y),(x+y)->(x+1,y+1),并且路徑不能和第四象限有交集。求P(n),并對10^9+7取模。
Input
第一行一個整數T,表示數據組數。
對于每組數據,一行一個整數n。
Output
對于每組數據,輸出答案。
Data Range
20%:n≤10;
50%:n≤10000;
100%:n≤106,T≤10。
?
Solution
20%
直接O(3^n*n)的暴力枚舉即可。
?
50%
考慮第一次直線y=0的點,假設是(i,0)。
那么從(1,1)到(i-1,1)之間的路徑均在直線y=1的上方,顯然有P(i-2)種。同理,從(x,0)到(n,0)之間的路徑均在直線y=0的上方,有P(n-i)種。
所以,全部合起來可以得到P(n)=Σni=1?P(i-2)P(n-i),其中,規定P(-1)=P(0)=1。
其實可以在20%基礎上打個表,考場有超過5人這樣寫。。。
?
100%
假設移動的路徑中一共有i個(x,y)->(x+1,y+1),那么就一定會有i個(x,y)->(x+1,y-1),n-2i個(x,y)->(x+1,y)。
而如果不考慮所有的(x,y)->(x+1,y),那么路徑的種數就是第i個Catalan數,設為C_i。如果加入(x,y)->(x+1,y),也就是在2i+1個空處中插入n-2i相同的球,方案數是C2in。
所以,P(n)=Σni=1?C_i?C2in。
?
1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 9 typedef long long LL; 10 11 #define N 1000010 12 #define MOD 1000000007 13 14 int t; 15 int n; 16 17 LL f[N],d[N]; 18 19 inline LL qpow(LL a,LL b) 20 { 21 LL ans=1; 22 while (b) 23 { 24 if (b&1) 25 ans=(1LL*ans*a)%MOD; 26 b>>=1; 27 a=(1LL*a*a)%MOD; 28 } 29 return ans; 30 } 31 32 inline LL C(LL x,LL y) 33 { 34 return f[x]*d[y]%MOD*d[x-y]%MOD; 35 } 36 37 inline LL Catalan(LL x) 38 { 39 return (C(x<<1,x)-C(x<<1,x-1)+MOD)%MOD; 40 } 41 42 int main() 43 { 44 freopen("move.in","r",stdin);freopen("move.out","w",stdout); 45 scanf("%d",&t); 46 f[0]=1; 47 for (int i=1;i<=1000000;i++) 48 f[i]=f[i-1]*i%MOD; 49 for (int i=0;i<=1000000;i++) 50 d[i]=qpow(f[i],MOD-2)%MOD; 51 while (t--) 52 { 53 scanf("%d",&n); 54 LL ans=0; 55 for (int i=0;i<=n;i+=2) 56 ans+=C(n,i)*Catalan(i>>1),ans%=MOD; 57 printf("%lld\n",ans); 58 } 59 return 0; 60 } View Code?
轉載于:https://www.cnblogs.com/yangjiyuan/p/5350633.html
總結
以上是生活随笔為你收集整理的【HNOI模拟By YMD】move的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVA 1151Buy or Build
- 下一篇: HUST1024 dance party