首页 > 代码库 > 51Nod 1118 机器人走方格--求逆元

51Nod 1118 机器人走方格--求逆元

 

 

(x/y) %mod =x*(y^(mod-2))%mod;

在算x,y的时候可以一直mod 来缩小

y^(mod-2)显然是个快速幂

#include <iostream>  
#include <stdio.h>  
#include <math.h>  
using namespace std;   
long long mod=1e+9+7;  
long long  quick(long long  n,long long  m)  
{  
    long long ans=1;  
    while(m)  
    {  
        if(m%2==1)  
            ans=ans*n%mod;  
        m/=2;  
        n*=n;  
        n%=mod;  
    }  
    return ans;  
}  
int main()  
{  
    int n,m;  
    cin>>n>>m;  
    int mu=m+n-2;  
    long long ans_mu=1;  
    long long ans_zi=1;  
    for(int i=m+n-2;i>m-1;i--)  
        ans_zi=ans_zi*i%mod;  
    for(int j=1;j<=n-1;j++)  
        ans_mu=ans_mu*j%mod;  
    long long tep=quick(ans_mu,mod-2);  
    cout<<ans_zi*tep%mod<<endl;  
    return 0;  
}  

 

法二:递推

mp[i][j]=mp[i-1][j]+mp[i][j-1]

#include <bits/stdc++.h>
#define MAXN 1010
#define ll long long
using namespace std;

ll mp[MAXN][MAXN];
const ll mod=1e9+7;

int main(void){
    int m, n;
    scanf("%d%d", &n, &m);
    for(int i=0; i<n; i++){
        mp[i][0]=1;
    }
    for(int j=0; j<m; j++){
        mp[0][j]=1;
    }
    for(int i=1; i<n; i++){
        for(int j=1; j<m; j++){
            mp[i][j]=mp[i-1][j]+mp[i][j-1];
            if(mp[i][j]>mod){
                mp[i][j]%=mod;
            }
        }
    }
    printf("%lld\n", mp[n-1][m-1]);
    return 0;
}

 

51Nod 1118 机器人走方格--求逆元