模板 組合數取模

2022-05-20 12:00:39 字數 1437 閱讀 3595

\(n \le 2000, m \le 2000\)

直接利用遞推式預處理即可。

**如下

#include using namespace std;

const int mod = 1e9 + 7;

int main()

for (int i = 1; i <= 2000; i++)

} while (n--)

return 0;

}

\(n, m \le 1e5\)

預處理出階乘和階乘的逆元,利用組合數的定義直接回答。

#include using namespace std;

typedef long long ll;

const int mod = 1e9 + 7;

const int maxn = 1e5 + 10;

ll fpow(ll a, ll b)

} return ret;

}int main()

inv[1e5] = fpow(fac[1e5], mod - 2);

for (int i = 1e5 - 1; i >= 0; i--)

}; prework();

auto get = [&](int a, int b) ;

while (n--)

return 0;}/*

(a, b) = a! / ((a - b)! * b!)

a! = a * (a - 1)!

a!' * a = (a - 1)!'

*/

\(n, m \le 1e18, p \le 1e5,p \in prime\)

預處理出 \(1...p\) 的階乘和階乘的逆元,用盧卡斯定理進行回答。

**如下

#include using namespace std;

typedef long long ll;

ll fpow(ll a, ll b, ll c)

} return ret;

}int main()

inv[p - 1] = fpow(fac[p - 1], p - 2, p);

for (int i = p - 2; i >= 0; i--)

auto c = [&](ll x, ll y) -> ll

return fac[x] * inv[x - y] % p * inv[y] % p;

};functionlucas = [&](ll x, ll y) -> ll

return c(x % p, y % p) * lucas(x / p, y / p) % p;

};cout << lucas(a, b) << endl;

} return 0;

}

組合數取模

複習了一下組合數取模,當然推薦檢視acdreamer的部落格啦,寫的確實好啦,自己把裡面的題目全a掉了。include include include include include include include using namespace std typedef long long ll l...

組合數取模

對於c n,m mod p。這裡的n,m,p p為素數 都很大的情況。就不能再用c n,m c n 1,m c n 1,m 1 的公式遞推了。這裡用到lusac定理 for non negative integers m and n and a prime p,the following congr...

組合數取模

組合數c m,n 表示在m個不同的元素中取出n個元素 不要求有序 產生的方案數。定義式 c m,n m n m n 並不會使用latex qaq 根據題目中對組合數的需要,有不同的計算方法。運用乙個數學上的組合恒等式 oi中稱之為楊輝三角 c m,n c m 1,n 1 c m 1,n 證明 1.直...