1. 程式人生 > 其它 >機器人走方格 V2/V3

機器人走方格 V2/V3

$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];
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; } 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;
}