bhupixb

modulo

Mar 10th, 2020
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.26 KB | None | 0 0
  1. #define int long long
  2.  
  3. // Warning: Change mod and N according to question
  4. const int N = 1e6 + 4;
  5. const int mod = 1e9 + 7;
  6.  
  7. int fact[N], invFact[N];
  8.  
  9. inline int add(int x, int y, int mod = ::mod) {
  10. x += y;
  11. if (x >= mod or x < 0) x %= mod;
  12. if (x >= 0) return x;
  13. return x + mod;
  14. }
  15. inline int mul(int x, int y, int mod = ::mod) {
  16. if (x >= mod or x + mod < 0) x %= mod;
  17. if (y >= mod or y + mod < 0) y %= mod;
  18. x *= y;
  19. if (x >= mod or x + mod < 0) x %= mod;
  20. if (x >= 0) return x;
  21. return x + mod;
  22. }
  23. inline int sub(int x, int y, int mod = ::mod) {
  24. x -= y;
  25. if (x + mod < 0 or x >= mod) {
  26. x %= mod;
  27. }
  28. if (x >= 0) return x;
  29. return x + mod;
  30. }
  31. int po(int x, int n, int mod = ::mod) {
  32. int res = 1;
  33. for (;n > 0;) {
  34. if (n & 1) {
  35. res = mul(res, x, mod);
  36. }
  37. x = mul(x, x, mod);
  38. n /= 2;
  39. }
  40. return res;
  41. }
  42.  
  43. void pre(){
  44. fact[0] = invFact[0] = invFact[1] = 1;
  45.  
  46. for(int i = 1 ; i < N ; i++) {
  47. fact[i] = mul(fact[i-1], i);
  48. }
  49.  
  50. for(int i = 2 ; i < N ; i++) {
  51. invFact[i] = mul((mod - mod / i), invFact[mod % i]);
  52. }
  53.  
  54. for(int i = 1; i < N ; i++) {
  55. invFact[i] = mul(invFact[i-1], invFact[i]);
  56. }
  57. }
  58. int ncr(int n, int r){
  59. return mul(mul(fact[n], invFact[r]), invFact[n-r]);
  60. }
Add Comment
Please, Sign In to add comment