HDU 5698 組合數學

2021-07-15 07:58:13 字數 1466 閱讀 1482

傳送門:

// 計算走i步的方法數

// 走i步 ,可以分解為在x方向上走的 x1,x2,...,xi

// 在y1,y2,..yi 步// 就是將 n-1分解為i的不為0的數,就相當於在n-2個空裡插入i-1個版
// 將 m-1 分解為i個不為0的數
// 也就是 c(n-2,i-1)*c(m-2,i-1)
//總數也就是sum(c(n-2,i-1)*c(m-2,i-1)) (for i=1 to min(n-1,m-1))
//  不妨變形一下換下i的取值範圍 也就有sum c(n-2,i)*c(m-2,i)(for i=0 to min(n-2,m-2))
// 再利用c(n,m)=c(n,n-m)// 就有sum c(n-2,i)*c(m-2,m-2-i)(for i=0 to min(n-2,m-2))
// 而c(n-2+m-2,m-2)就是從n+m-4個數裡面選擇出m-2個數的組合數
// 按照從前n-2個數裡面選擇的個數i來分類的話,有i=0 to i=min(n-2,m-2)
// 可以這樣考慮 相當於從n-2 + m-2 個數 裡面 選出 i + (m-2-i)=(m-2) 個數的個數
// 因為c(n-2,i):從前n-2 個數裡面選出 i個數
//   c(m-2,m-2-i):那麼就要從剩餘的m-2個數裡面選出(m-2-i)
// 按照乘法原理:這一類有c(n-2,i)*c(m-2,m-2-i)種
//   按照加法原理 就是sum c(n-2,i)*c(m-2,m-2-i) (for i=0 to min(n-2,m-2) )
// 這就證明了 c(n-2+m-2,m-2)==sum(c(n-2,i-1)*c(m-2,i-1)) (for i=1 to min(n-1,m-1))// multiply case wa 1

#include
#include#include#define mod 1000000007

using namespace std;

typedef long long ll;

ll quickmod(ll b,ll p,ll mod)

return res;

}ll inverse(ll x,ll mod)

ll c(ll n,ll m,ll mod)

//cout<>n>>m)

cout<

HDU 5698 瞬間移動(組合數,逆元)

x和y分開考慮,在 1,1 到 n,m 之間可以選擇走i步。就需要選i步對應的行c n 2,i 及i步對應的列c m 2,i 相乘起來。假設 m leq n sum c i cdot c i sum c i cdot c c 然後標程裡求i的階乘的逆是預處理的,主要這句 f i m m i cdot...

HDU 5698 瞬間移動 數學

有乙個無限大的矩形,初始時你在左上角 即第一行第一列 每次你都可以選擇乙個右下方格仔,並瞬移過去 如從下圖中的紅色格仔能直接瞬移到藍色格仔 求到第n行第m列的格仔有幾種方案,答案對1000000007取模。多組測試資料。兩個整數n,m 2 n,m 100000 乙個整數表示答案 4 5數學題先打表,...

hdu 5698瞬間移動(組合數取模 盧卡斯定理)

資料範圍 2 n,m 100000,mod 1000000007。思路 打表可以發現這個方法數是乙個楊輝三角。根據楊輝三角的性質,可以知道楊輝三角裡面第n行,第m列的數值為c n 1,m 1 所以我們只要將題目所給的行列轉化一下,然後計算組合數即可。由於n,m給的範圍比較大。不能直接計算,這是就用到...