Advertisement
Guest User

Untitled

a guest
Jan 17th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.05 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define pb push_back
  6. #define mp make_pair
  7. #define F first
  8. #define S second
  9. #define fo(i, n) for(int i = 1; i <= n; ++i)
  10.  
  11. typedef long long ll;
  12. typedef pair<int, int> pii;
  13. typedef pair<ll, ll> pll;
  14. typedef long double ld;
  15.  
  16. const int N = 40;
  17. const int K = 20;
  18. const int mod = 1e9 + 7;
  19. const ld eps = 1e-15L;
  20.  
  21. int cnt[N], a[N], b[N];
  22. int n, q;
  23. ll res[40 * 100000];
  24. ld L[(1 << K)];
  25. ld R[(1 << K)];
  26.  
  27. bool eq(ld x, ld y)
  28. {
  29. return abs(x - y) < eps;
  30. }
  31.  
  32. int main()
  33. {
  34. scanf("%d", &n);
  35. for(int i = 0; i < n; ++i)
  36. scanf("%d", a + i);
  37. for(int i = 0; i < n; ++i)
  38. scanf("%d", b + i);
  39. int min_val = 0;
  40. for(int i = 0; i < n; ++i)
  41. min_val += a[i] / b[i];
  42.  
  43. int m = (n + 1) >> 1;
  44.  
  45. for(int i = 0; i < (1 << m); ++i)
  46. {
  47. ld s = 0.0;
  48. for(int j = 0; j < m; ++j)
  49. if((i >> j) & 1)
  50. s += a[j] / (b[j] + 0.0L);
  51. else
  52. s += a[j] / b[j];
  53. L[i] = s;
  54. }
  55.  
  56. int h = n - m;
  57. for(int i = 0; i < ( 1 << h ); ++i)
  58. {
  59. ld s = 0.0;
  60. for(int j = 0; j < h; ++j)
  61. if((i >> j) & 1)
  62. s += a[j + m] / (b[j + m] + 0.0L);
  63. else
  64. s += a[j + m] / b[j + m];
  65. R[i] = s;
  66. }
  67.  
  68. stable_sort(L, L + (1 << m));
  69. stable_sort(R, R + (1 << h));
  70. reverse(L, L + (1 << m));
  71. /* for(int i = 0; i < (1 << m); ++i)
  72. printf("%.3Lf ", L[i]);
  73. puts("");
  74. for(int i = 0; i < (1 << h); ++i)
  75. printf("%.3Lf ", R[i]);
  76. puts("");
  77. */
  78. int l = 0, r = -1;
  79. for(int check_val = min_val; check_val <= min_val + n; ++check_val)
  80. {
  81. l = 0, r = -1;
  82. for(int i = 0; i < (1 << h); ++i)
  83. {
  84. if(i == 0 || !eq(R[i], R[i - 1]) && R[i] + L[l] > ld(check_val) + eps)
  85. {
  86. l = r + 1;
  87. while(R[i] + L[l] > ld(check_val) + eps)
  88. ++l;
  89. r = l;
  90. while(r < (1 << m) && eq(L[l], L[r])) ++r;
  91. r--;
  92. }
  93. if(eq(check_val, R[i] + L[l]))
  94. res[check_val] += r - l + 1;
  95. }
  96. }
  97.  
  98. scanf("%d", &q);
  99. while(q--) {
  100. int x;
  101. scanf("%d", &x);
  102. if(x >= 0 && x <= 40 * 100000)
  103. printf("%lld\n", res[x]);
  104. else
  105. puts("0");
  106. }
  107.  
  108. return 0;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement