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]
implSolution { pubfnmaximum_prime_difference(nums: Vec<i32>) ->i32 { letmut primer = Vec::new(); foriin0..nums.len() { letx = nums[i]; if x == 1 { continue; } letmut j = 2; letmut isPrimer = true; while j * j <= x { if x % j == 0 { isPrimer = false; break; } j += 1; } if isPrimer { primer.push(i) } } return (primer[primer.len() - 1] - primer[0]) asi32; } }
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
implSolution { fnbit_count(mut n: i64) ->i64 { letmut count = 0; while n > 0 { count += n & 1; n >>= 1; } count }
fngcd(mut a: i64, mut b: i64) ->i64 { while b != 0 { lettemp = b; b = a % b; a = temp; } a.abs() }
pubfnfind_kth_smallest(coins: Vec<i32>, k: i32) ->i64 { letn = coins.len() asi32; letmut lcm: Vec<i64> = vec![1; 1 << n]; letmut res = 0; letmut lo = 1asi64; letmut hi = 10i64.pow(20);
foriin1..(1 << n asu32) { for (j, &coin) in coins.iter().enumerate() { if (i >> j) & 1 != 0 { lcm [i] = lcm[i] * (coin asi64) / Self::gcd(lcm[i], coin asi64); } } }
while lo <= hi { letmid = (lo + hi) / 2; letmut tot = 0;
foriin1..(1 << n asusize) { letm = Self::bit_count(i); if m % 2 == 1 { tot += mid / lcm[i asusize]; } else { tot -= mid / lcm[i asusize]; } } if tot >= k asi64 { res = mid; hi = mid - 1; } else { lo = mid + 1; } } 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; } };