機器人走方格 V2/V3
阿新 • • 發佈:2021-11-27
$T1.$
經典路徑模型,等價於構造出長為$(n+m-2)$的$D$和$R$序列,$D$出現$(m-1)$次方案數
易得答案為$\binom{n+m-2}{m-1}=\binom{n+m-2}{n-1}$
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> using namespace std; typedef long long ll; const ll MOD=1e4+7; ll fac[MOD+5],inv[MOD+5]; intn,m; ll power(ll a,ll b,ll MOD){ ll ret=1; for (;b;b>>=1){ if (b&1) ret=(ret*a)%MOD; a=(a*a)%MOD; } return ret; } void init(){ fac[0]=1,inv[0]=1; for (int i=1;i<MOD;i++){ fac[i]=fac[i-1]*i%MOD; inv[i]=power(fac[i],MOD-2,MOD); } } ll C(int n,int m){ if (n<m) return 0; return fac[n]*inv[m]%MOD*inv[n-m]%MOD; } ll Lucas(int n,int m){ if (!m) return 1; return Lucas(n/MOD,m/MOD)*C(n%MOD,m%MOD)%MOD; } int main(){ int n; cin>>n; init(); printf("%lld\n",(Lucas(2*n-2,n-1)-Lucas(2*n-2,n-2)+MOD)%MOD*2%MOD); }
$T2.$
不經過對角線的不降路徑因有$D\leq R$的限制,可轉化為卡特蘭數
答案為$2Catalan_{n-1}$
又因為$n$,$m$範圍較大,無法快速處理階乘,而$p$較小,故考慮使用$Lucas$定理
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> using namespace std; typedef long long ll; const ll MOD=1e4+7; ll fac[MOD+5],inv[MOD+5]; int n,m; ll power(ll a,ll b,ll MOD){ ll ret=1; for (;b;b>>=1){ if (b&1) ret=(ret*a)%MOD; a=(a*a)%MOD; } return ret; } void init(){ fac[0]=1,inv[0]=1; for (int i=1;i<MOD;i++){ fac[i]=fac[i-1]*i%MOD; inv[i]=power(fac[i],MOD-2,MOD); } } ll C(int n,int m){ if (n<m) return 0; return fac[n]*inv[m]%MOD*inv[n-m]%MOD; } ll Lucas(int n,int m){ if (!m) return 1; return Lucas(n/MOD,m/MOD)*C(n%MOD,m%MOD)%MOD; } ll cat(int n){ return (Lucas(2*n,n)-Lucas(2*n,n-1)+MOD)%MOD; } int main(){ int n; cin>>n; init(); cout<<2*cat(n-1)%MOD; }