51nod 1119 機械人走方格V2

2021-09-24 04:43:24 字數 1261 閱讀 7084

m * n的方格,乙個機械人從左上走到右下,只能向右或向下走。有多少種不同的走法?由於方法數量可能很大,只需要輸出mod 10^9 + 7的結果。

收起輸入

第1行,2個數m,n,中間用空格隔開。(2 <= m,n <= 1000000)

輸出輸出走法的數量 mod 10^9 + 7。

輸入樣例

2 3輸出樣例

3

題目傳送門

#include#include#includeusing namespace std;

const long long maxn = 1e9 + 7;

long long m, n;

long long fun(long long x,long long y)

int main()

但由於m,n的取值範圍過大,超出題目所要求的時間範圍,所以不得不換一種思路。

可以看出在m×n的方格中,從左上角走到右下角一共要走m+n-2個方格,其中向下走m-1個方格,向右走n-1個方格,也就是在m+n-2步中選取m-1或者n-1步有多少種組合方式,即c(m+n-2,min(m-1,n-1))%mod(題目要求輸出走法的數量%mod)。

除法取模可以用費馬小定理求逆元
根據排列組合的公示,可將原始變為a/b%mod=x(x為最終輸出結果),即a/b=x(%mod)

費馬小定理:假如p是質數,且(a,mod)=1,那麼 a^(mod-1) ≡1(%mod)

假如mod是質數,且a,mod互質,那麼 a的(mod-1)次方除以mod的餘數恆等於1

即b^(mod-1)=1(%mod)(mod是質數且與b互質)

可推導出a/b×b^(mod-1)=x(%mod)(因為,a%c=x,b%c=y,則a×b%c=x×y)

即a×b^(mod-2) =x(%mod),所以x=a×b^(mod-2)%mod;可用快速冪求解。

#include#include#includeusing namespace std;

const long long maxn = 1e9 + 7;

long long m, n;

long long quick_pow(long long x, long long y)

y >>= 1;

x = x * x%maxn;

} return ans%maxn;

}int main()

參考資料

51nod 1119 機械人走方格 V2

乙個機械人從左上走到右下,每次只能往下或往右走,問最後到達右下時能有多少種方法。1.如果n,m小的話可以遞迴求解,但是這裡n,m太大,陣列開不了。我們取乙個小一點的n,m。用遞推填表,可以發現表是乙個楊輝三角。楊輝三角在第n行第m列的值為c n 1,m 1 可以得到 n,m 位置處應該填上c n 1...

51nod1119 機械人走方格 V2

終於學到了求組合數的正確姿勢 c n m 2,m 1 include include include includeusing namespace std define rep i,s,t for int i s i t i define dwn i,s,t for int i s i t i de...

51nod1119 機械人走方格V2

解題關鍵 1 此題用dp的方法可以看出,dp矩陣為楊輝三角,通過總結,可以得出 答案的解為 c 2 此題可用組合數學的思想考慮,總的步數一共有 n m 2 步,在這所有的步數中,需要選擇向下走的步數的位置,由此可得,答案的解為 c 此題即可轉化為大組合數取模問題 1 include2 using n...