1 条题解
-
0
【模板】卢卡斯定理(Lucas Theorem) 题解
思路分析
按题目要求使用对应数据结构与算法模拟/递推求解,注意数据范围边界与时间复杂度。
参考代码
#include <iostream> #include <vector> using namespace std; long long qpow(long long a, long long b, long long p) { long long res = 1 % p; a %= p; while (b > 0) { if (b & 1) res = res * a % p; a = a * a % p; b >>= 1; } return res; } long long C_small(long long n, long long m, long long p, const vector<long long>& fact) { if (m < 0 || m > n) return 0; long long num = fact[n]; long long den = fact[m] * fact[n - m] % p; return num * qpow(den, p - 2, p) % p; } long long lucas(long long n, long long m, long long p, const vector<long long>& fact) { if (m == 0) return 1 % p; return C_small(n % p, m % p, p, fact) * lucas(n / p, m / p, p, fact) % p; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; if (!(cin >> T)) return 0; while (T--) { long long n, m, p; cin >> n >> m >> p; vector<long long> fact(p, 1); for (long long i = 1; i < p; ++i) fact[i] = fact[i - 1] * i % p; cout << lucas(n + m, n, p, fact) << "\n"; } return 0; }
- 1
信息
- ID
- 8621
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者