Advertisement
Guest User

Untitled

a guest
Apr 30th, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.04 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cassert>
  4. #include <iostream>
  5. #include <algorithm>
  6. #include <vector>
  7. #include <set>
  8.  
  9. #define FOR(i, a, b) for (int i = (a); i < (b); ++i)
  10. #define REP(i, n) FOR (i, 0, n)
  11. #define _ << " _ " <<
  12. #define TRACE(x) cerr << #x << " = " << x << endl
  13. #define debug(...) fprintf(stderr, __VA_ARGS__)
  14. //#define debug
  15. //#define TRACE(x)
  16.  
  17. using namespace std;
  18.  
  19. typedef long long llint;
  20.  
  21. const llint BASE = 1e18;
  22.  
  23. struct bignum {
  24. int len;
  25. __int128 val[2];
  26. bignum(llint x = 0) {
  27. memset(val, 0, sizeof val);
  28. len = 1;
  29. val[0] = x;
  30. trim();
  31. }
  32.  
  33. bool operator < (const bignum &b) const {
  34. if (len != b.len) return len < b.len;
  35. for (int i = len-1; i >= 0; --i)
  36. if (val[i] != b.val[i])
  37. return val[i] < b.val[i];
  38. return false;
  39. }
  40.  
  41. void trim(void) {
  42. __int128 tmp = 0;
  43. REP (i, len) {
  44. val[i] += tmp;
  45. tmp = val[i] / BASE;
  46. val[i] %= BASE;
  47. }
  48. for (; tmp > 0; tmp /= BASE)
  49. val[len++] = tmp % BASE;
  50. }
  51.  
  52. void print(void) {
  53. for (int i = len-1; i >= 0; --i)
  54. if (i == len-1)
  55. printf("%lld", (long long)val[i]);
  56. else
  57. printf("%02lld", (long long)val[i]);
  58. }
  59. };
  60.  
  61. bignum operator + (const bignum &a, const bignum &b) {
  62. bignum c;
  63. c.len = max(a.len, b.len);
  64. REP (i, c.len) c.val[i] = a.val[i] + b.val[i];
  65. c.trim();
  66. return c;
  67. }
  68.  
  69. bignum operator * (const bignum &a, const bignum &b) {
  70. bignum c;
  71. c.len = a.len + b.len - 1;
  72. REP (i, a.len) REP (j, b.len)
  73. c.val[i+j] += a.val[i] * b.val[j];
  74. c.trim();
  75. return c;
  76. }
  77.  
  78. const int MAXN = 10000010;
  79.  
  80. const int A = 1103515245;
  81. const int B = 12345;
  82. const int M = (1LL<<31) - 1;
  83.  
  84. int n, r;
  85. int a[2*MAXN];
  86. bignum U[2*MAXN], D[2*MAXN];
  87. bignum P10[65];
  88.  
  89. inline string str(char c) {
  90. string tmp;
  91. tmp.push_back(c);
  92. return tmp;
  93. }
  94.  
  95. bignum add_back(const bignum &x, const bignum &y) {
  96. return x * P10[y.len] + y;
  97. }
  98.  
  99. // inline string get(const string &up, const int &ud,
  100. // const string &dp, const int &dd) {
  101. // string udc = ud == -1 ? "" : str(ud + '0');
  102. // string ddc = dd == -1 ? "" : str(dd + '0');
  103. // return up + udc + ddc + dp;
  104. // }
  105.  
  106. inline bool cmp(const string &s1, const string &s2) {
  107. if (s1.size() != s2.size()) return s1.size() < s2.size();
  108. return s1 < s2;
  109. }
  110.  
  111. int main(void) {
  112. memset(a, -1, sizeof a);
  113.  
  114. scanf("%d%d", &n, &r);
  115. for (int i = 2; i <= n; ++i) {
  116. r = ((llint)A*r + B) & M;
  117. a[i] = ((r >> 16) % 9) + 1;
  118. }
  119.  
  120. P10[0] = 1;
  121. FOR (i, 1, 60) {
  122. P10[i] = P10[i-1] * 10;
  123. P10[i].print();
  124. putchar('\n');
  125. }
  126.  
  127. bignum X(35), Y(3241);
  128. add_back(X, Y).print();
  129.  
  130. // llint sum = 0;
  131. // for (int i = n; i >= 1; --i) {
  132. // if (i > 1) {
  133. // string tmp;
  134. // tmp = U[i] + char(a[i] + '0');
  135. // if (cmp(U[i/2], tmp)) U[i/2] = tmp;
  136. // tmp = char(a[i] + '0') + D[i];
  137. // if (cmp(D[i/2], tmp)) D[i/2] = tmp;
  138. // }
  139.  
  140. // string tmp = get(U[2*i], a[2*i], D[2*i+1], a[2*i+1]);
  141. // if (cmp(ans[i], tmp)) ans[i] = tmp;
  142. // tmp = get(U[2*i+1], a[2*i+1], D[2*i], a[2*i]);
  143. // if (cmp(ans[i], tmp)) ans[i] = tmp;
  144. // }
  145.  
  146. // printf("%lld\n", sum);
  147.  
  148. return 0;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement