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