[关闭]
@ZCDHJ 2019-09-16T13:28:07.000000Z 字数 1485 阅读 940

Lucas定理 笔记

Lucas定理


Lucas定理:当 是质数时,对于任意正整数 满足

证明:令 。需证明 。因为 ,所以 。那么就有 。考虑 也就是 实际上是在多项式 项的系数,由前面的同余式得到这个系数同时也是 也就是 的情况,所以 得证。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. typedef long long LL;
  5. #define int LL
  6. const int MAXN = 1e5;
  7. int T;
  8. int fac[MAXN | 1];
  9. inline int read() {
  10. register int x = 0;
  11. register char ch = getchar();
  12. while (!isdigit(ch)) ch = getchar();
  13. while (isdigit(ch)) {
  14. x = x * 10 + ch - '0';
  15. ch = getchar();
  16. }
  17. return x;
  18. }
  19. inline int fast_pow(int x, int y, int p) {
  20. int res = 1, base = x;
  21. while (y > 0) {
  22. if (y & 1) res = (res * base) % p;
  23. base = base * base % p;
  24. y >>= 1;
  25. }
  26. return res;
  27. }
  28. inline int C(int x, int y, int p) {
  29. if (x < y) return 0;
  30. return (fac[x] * fast_pow(fac[x - y], p - 2, p) % p * fast_pow(fac[y], p - 2, p)) % p;
  31. }
  32. int Lucas(int x, int y, int p) {
  33. if (!y) return 1;
  34. return C(x % p, y % p, p) * Lucas(x / p, y / p, p) % p;
  35. }
  36. signed main() {
  37. T = read();
  38. while (T--) {
  39. int n = read(), m = read(), p = read();
  40. fac[0] = 1;
  41. for (int i = 1; i <= p; ++i) fac[i] = (fac[i - 1] * i) % p;
  42. printf("%lld\n", Lucas(n + m, m, p));
  43. }
  44. return 0;
  45. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注