Advertisement
Guest User

Untitled

a guest
Apr 30th, 2017
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.73 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 int MAXN = 10000010;
  22.  
  23. const int A = 1103515245;
  24. const int B = 12345;
  25. const int M = (1LL<<31) - 1;
  26.  
  27. int n, r;
  28. int a[2*MAXN];
  29. llint ans[2*MAXN];
  30. pair<llint, int> U[2*MAXN], D[2*MAXN];
  31. int p10[60];
  32.  
  33. llint get(pair<llint, int> up, int ud,
  34. pair<llint, int> dp, int dd) {
  35. if (ud == -1 && dd == -1) return 0;
  36. if (ud == -1) return dd * p10[dp.second] + dp.first;
  37. if (dd == -1) return up.first*10 + ud;
  38. return (up.first*10 + ud) * p10[1 + dp.second] +
  39. dd * p10[dp.second] + dp.first;
  40. }
  41.  
  42. int main(void) {
  43. memset(a, -1, sizeof a);
  44.  
  45. scanf("%d%d", &n, &r);
  46. for (int i = 2; i <= n; ++i) {
  47. r = ((llint)A*r + B) & M;
  48. a[i] = ((r >> 16) % 9) + 1;
  49. }
  50.  
  51. p10[0] = 1;
  52. for (int i = 1; i < 60; ++i)
  53. p10[i] = 10 * p10[i-1];
  54.  
  55.  
  56. llint sum = 0;
  57. for (int i = n; i >= 1; --i) {
  58. if (i > 1) {
  59. pair<llint, int> tmp;
  60. tmp = {U[i].first * 10 + a[i], 1+U[i].second};
  61. if (U[i/2] < tmp) U[i/2] = tmp;
  62. tmp = {D[i].first + a[i] * p10[U[i].second], 1+U[i].second};
  63. if (D[i/2] < tmp) D[i/2] = tmp;
  64. }
  65.  
  66. ans[i] = max(ans[i], get(U[2*i], a[2*i], D[2*i+1], a[2*i+1]));
  67. ans[i] = max(ans[i], get(U[2*i+1], a[2*i+1], D[2*i], a[2*i]));
  68. if (!(ans[i] >= 0 && ans[i] < 10133099161583616LL)) {
  69. TRACE(i _ ans[i]);
  70. }
  71. sum += ans[i];
  72. }
  73.  
  74. TRACE(ans[1]);
  75.  
  76. printf("%lld\n", sum);
  77.  
  78. return 0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement