Advertisement
Guest User

Untitled

a guest
Aug 28th, 2014
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.04 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <queue>
  4. #include <vector>
  5. #include <set>
  6. #include <map>
  7. #include <string>
  8. #include <cstring>
  9. #include <cmath>
  10. #include <algorithm>
  11. #include <ctime>
  12. #include <utility>
  13. #include <cassert>
  14.  
  15. #define fname ""
  16. #define F first
  17. #define S second
  18. #define pb push_back
  19. #define mp make_pair
  20.  
  21. using namespace std;
  22.  
  23. typedef long long LL;
  24. typedef pair <int, int> PII;
  25. typedef vector <int> VI;
  26.  
  27. const int maxn = 1000 * 1000;
  28. const int inf = 2 * 1000 * 1000 * 1000;
  29. const int mod = 1000 * 1000 * 1000 + 7;
  30. const int MAX_N = 1000 * 10000;
  31.  
  32. char s[maxn], ans;
  33. int d, n, R[20], T, h, lh, pos[maxn];
  34.  
  35. bool check(int l1, int r1, int l2, int r2) {
  36. int k1 = l1 % n, k2 = l2 % n;
  37.  
  38. for (int i = 0; i < min(10, r1 - l1 + 1); ++i) {
  39. if (s[k1] > s[k2])
  40. return true;
  41. if (s[k1] < s[k2])
  42. return false;
  43. k1++;
  44. k2++;
  45. if (k1 == n)
  46. k1 = 0;
  47. if (k2 == n)
  48. k2 = 0;
  49. }
  50.  
  51. return false;
  52. }
  53.  
  54. int main() {
  55. // freopen(fname"in", "r", stdin);
  56. // freopen(fname"out", "w", stdout);
  57.  
  58. scanf("%s", s);
  59. scanf("%d", &d);
  60.  
  61. n = strlen(s);
  62.  
  63. if (d == 2 || d == 5) {
  64. ans = '9';
  65. for (int i = 0; i < n; ++i)
  66. if ((s[i] - '0') % d == 0)
  67. ans = min(ans, s[i]);
  68.  
  69. if (ans == '9')
  70. puts("-1");
  71. else
  72. printf("%c\n", ans);
  73.  
  74. return 0;
  75. }
  76.  
  77. R[1] = 1;
  78. for (int i = 2; i < min(11,d); ++i)
  79. R[i] = (d - ((d / i) * 1ll * R[d % i] % d)) % d;
  80.  
  81. T = 1;
  82. h = s[0] - '0';
  83.  
  84. for (int i = 0; i < d; ++i)
  85. pos[i] = -1;
  86.  
  87. int k = 0, l = -1, r = inf;
  88.  
  89. R[10] = R[10 % d];
  90.  
  91. for (int i = 0; i < MAX_N; ++i) {
  92. lh = (h * 1ll * T) % d;
  93. if (pos[lh] != -1 && (r - l > i - pos[lh] - 1 || (r - l == i - pos[lh] - 1 && check(l, r, pos[lh] + 1, i)))) {
  94. l = pos[lh] + 1;
  95. r = i;
  96. }
  97. pos[lh] = i;
  98. if (++k == n)
  99. k = 0;
  100. h = (h * 10ll % d + s[k] - '0') % d;
  101. T = (T * 1ll * R[10]) % d;
  102. }
  103.  
  104. if (r == inf) {
  105. puts("-1");
  106. return 0;
  107. }
  108.  
  109. k = l % n;
  110.  
  111. for (int i = 0; i < r - l + 1; ++i) {
  112. printf("%c", s[k]);
  113. if (++k == n)
  114. k = 0;
  115. }
  116. return 0;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement