- 题目大意
求在n棵树上摘不超过m颗豆子的方案,结果对p取模。
- 解题思路
利用插板法,再套用Lucas定理的模板解决即可。
- 代码
#include<iostream> using namespace std; const long long MAX = 2000000; long long num[MAX]; void zh(long long mod) { num[0] = 1; for (long long i = 1; i <mod; i++) num[i] = num[i - 1] * i%mod; } long long powMod(long long a, long long n, long long mod) { long long ans = 1; for (; n > 0; n >>= 1) { if (n & 1) ans = ans * a%mod; a = a * a%mod; } return ans; } long long Lucas(long long n, long long m, long long p) { long long ans = 1; while (n&&m) { if (n%p<m % p) return 0; ans = (ans*num[n % p] * powMod(num[m % p] * num[n % p - m % p] % p, p - 2, p)) % p; n /= p; m /= p; } return ans; } int main() { int t; cin >> t; long long n, m, p; while (t--) { long long sum = 0; cin >> n >> m >> p; zh(p); sum = Lucas(m + n, n, p); cout << sum << endl; } return 0; }