Advertisement
Guest User

Untitled

a guest
Oct 17th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.06 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. /*****
  5. a, b, c = number
  6. n = length of a
  7. m = length of b
  8. k = max(n, m)
  9. + : O(n + m)
  10. - : Not Defined
  11. * : O(k log k) with FFT
  12. / : Not Defined
  13. pow(a, b) : O((m + n log n) log b)
  14. *****/
  15.  
  16. typedef complex<double> cpx;
  17. typedef vector<cpx> vec;
  18. const double pi = acos(-1);
  19.  
  20. struct BigInt{
  21. vector<int> v;
  22. BigInt(){
  23. v.clear(); v.push_back(0);
  24. }
  25. BigInt(long long x){
  26. v.clear();
  27. while(x){
  28. v.push_back(x % 10); x /= 10;
  29. }
  30. if(v.size() == 0) v.push_back(0);
  31. }
  32. BigInt(const vector<int> &t){
  33. v.clear(); v.reserve(t.size());
  34. for(auto i : t) v.push_back(i);
  35. while(v.size() > 1 && v.back() == 0) v.pop_back();
  36. }
  37. void print(){
  38. while(v.size() > 1 && v.back() == 0) v.pop_back();
  39. for(int i=v.size()-1; i>=0; i--) cout << v[i];
  40. }
  41. };
  42.  
  43. vector<int> Plus(const vector<int> &a, const vector<int> &b){
  44. int n = max(a.size(), b.size()) + 1;
  45. vector<int> ret(n);
  46. for(int i=0; i<a.size(); i++) ret[i] += a[i];
  47. for(int i=0; i<b.size(); i++) ret[i] += b[i];
  48. for(int i=0; i<n-1; i++){
  49. if(ret[i] < 0){
  50. int b = (abs(ret[i]) + 9) / 10;
  51. ret[i] += b * 10;
  52. ret[i+1] -= b;
  53. }else{
  54. ret[i+1] += ret[i] / 10;
  55. ret[i] %= 10;
  56. }
  57. }
  58. while(ret.size() > 1 && ret.back() == 0) ret.pop_back();
  59. return ret;
  60. }
  61.  
  62. void FFT(vec &f, cpx w){
  63. int n = f.size();
  64. if(n == 1) return;
  65. vec even(n >> 1), odd(n >> 1);
  66. for(int i=0; i<n; i++){
  67. if(i & 1) odd[i >> 1] = f[i];
  68. else even[i >> 1] = f[i];
  69. }
  70. FFT(even, w*w); FFT(odd, w*w);
  71. cpx wp(1, 0);
  72. for(int i=0; i<n/2; i++){
  73. f[i] = even[i] + wp * odd[i];
  74. f[i+n/2] = even[i] - wp * odd[i];
  75. wp *= w;
  76. }
  77. }
  78.  
  79. vec Mul(vec a, vec b){
  80. int n = 1;
  81. while(n <= a.size() || n <= b.size()) n <<= 1;
  82. n <<= 1;
  83. a.resize(n); b.resize(n);
  84. vec c(n);
  85. cpx w(cos(2*pi/n), sin(2*pi/n));
  86. FFT(a, w); FFT(b, w);
  87. for(int i=0; i<n; i++) c[i] = a[i] * b[i];
  88. FFT(c, cpx(w.real(), -w.imag()));
  89. for(int i=0; i<n; i++){
  90. c[i] /= cpx(n, 0);
  91. c[i] = cpx(round(c[i].real()), round(c[i].imag()));
  92. }
  93. return c;
  94. }
  95.  
  96. vector<int> Mul(vector<int> a, vector<int> b){
  97. vec A, B, C;
  98. for(auto i : a) A.push_back(cpx(i, 0));
  99. for(auto i : b) B.push_back(cpx(i, 0));
  100. C = Mul(A, B);
  101. vector<int> v(C.size());
  102. for(int i=0; i<C.size(); i++) v[i] = (int)round(C[i].real());
  103. v.push_back(0);
  104. for(int i=0; i<v.size()-1; i++){
  105. if(v[i] < 0){
  106. int b = (abs(v[i]) + 9) / 10;
  107. v[i+1] -= b;
  108. v[i] += b * 10;
  109. }else{
  110. v[i+1] += v[i] / 10;
  111. v[i] %= 10;
  112. }
  113. }
  114. while(v.size() > 1 && v.back() == 0) v.pop_back();
  115. return v;
  116. }
  117.  
  118. BigInt div2(BigInt a){
  119. int c = 0;
  120. for(int i=a.v.size()-1; i>=0; i--){
  121. int now = c*10 + a.v[i];
  122. c = now % 2;
  123. a.v[i] = now / 2;
  124. }
  125. while(a.v.size() > 1 && a.v.back() == 0) a.v.pop_back();
  126. return a;
  127. }
  128.  
  129. BigInt operator + (const BigInt &a, const BigInt &b){
  130. vector<int> ret = Plus(a.v, b.v);
  131. return BigInt(ret);
  132. }
  133.  
  134. BigInt operator * (const BigInt &a, const BigInt &b){
  135. vector<int> ret = Mul(a.v, b.v);
  136. return BigInt(ret);
  137. }
  138.  
  139. BigInt pow(BigInt a, BigInt b){
  140. BigInt ret(1);
  141. while(1){
  142. if(b.v.size() == 0) break;
  143. if(b.v.size() == 1 && b.v[0] == 0) break;
  144. if(b.v[0] & 1) ret = ret * a;
  145. a = a * a;
  146. b = div2(b);
  147. }
  148. return ret;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement