classSolution: defmaximumPrimeDifference(self, nums: List[int]) -> int: primer = [] for i, x inenumerate(nums): if x == 1: continue isPrimer = True j = 2 while j * j <= x: if x % j == 0: isPrimer = False break j += 1 if isPrimer: primer.append(i) return primer[-1] - primer[0]
classSolution: deffindKthSmallest(self, coins: List[int], k: int) -> int: n = len(coins) res = 0 lo, hi = 1, 10**20 while lo <= hi: mid = (lo + hi) // 2 tot = 0 for i inrange(1, 1 << n): lcm = 1 cnt = 0 for j inrange(len(coins)): if i & (1 << j): cnt += 1 lcm = coins[j] * lcm // math.gcd(lcm, coins[j]) cur = mid // lcm tot += cur if cnt % 2 == 1else -cur
if tot >= k: res = mid hi = mid - 1 else: lo = mid + 1 return res
voidupdateTree(int x, int i, int val, int idx){ if (x < tree[idx].l || x > tree[idx].r) { return; } if (x == tree[idx].l && x == tree[idx].r) { tree[idx].minVal[i] = val; return; } int mid = (tree[idx].l + tree[idx].r) / 2; if (x <= mid) { updateTree(x, i, val, CHL(idx)); } else { updateTree(x, i, val, CHR(idx)); } pushUpTree(idx); }
intqueryTree(int l, int r, int i, int idx){ if (r < tree[idx].l || l > tree[idx].r) { return INT_MAX; } if (l <= tree[idx].l && r >= tree[idx].r) { return tree[idx].minVal[i]; } int mid = (tree[idx].l + tree[idx].r) / 2; if (r <= mid) { returnqueryTree(l, r, i, CHL(idx)); } elseif (l > mid) { returnqueryTree(l, r, i, CHR(idx)); } else { returnmin(queryTree(l, mid, i, CHL(idx)), queryTree(mid + 1, r, i, CHR(idx))); } }
classSolution { public: intminimumValueSum(vector<int>& nums, vector<int>& andValues){ int n = nums.size(), m = andValues.size(); vector<int> cnt(21, -1); vector<vector<int>> f(n, vector<int>(m, -1)); vector<vector<int>> g(n, vector<int>(m, -1));
for (int i = 0; i < n; i++) { for (int j = 0; j <= 20; j++) { if (((nums[i] >> j) & 1) == 0) { cnt[j] = i; } } for (int j = 0; j < m; j++) { int val = andValues[j]; int left = 0, right = i; for (int k = 0; k <= 20; k++) { if ((val >> k) & 1) { left = max(left, cnt[k] + 1); } else { right = min(right, cnt[k]); } } if (left <= right) { f[i][j] = left; g[i][j] = right; } } }
buildTree(1, 0, n - 1); int prefix = nums[0]; for (int i = 0; i < n; i++) { prefix &= nums[i]; if (prefix == andValues[0]) { updateTree(i, 0, nums[i], 1); } for (int j = 1; j < m; j++) { int left = f[i][j], right = g[i][j]; if (left == -1 || right == -1) { continue; } if (right > 0) { int cur = queryTree(max(left - 1, 0), right - 1, j - 1, 1); if (cur != INT_MAX) { updateTree(i, j, cur + nums[i], 1); } } } }
int ans = queryTree(n - 1, n - 1, m - 1, 1); return ans == INT_MAX ? -1 : ans; } };