#Q1
def smallest_subarray_infinite(arr, k):
    n = len(arr)
    total = sum(arr)
    prefix = {0: -1}
    curr, min_len = 0, float('inf')
    
    for i in range(2 * n):
        curr += arr[i % n]
        if curr - k in prefix:
            min_len = min(min_len, i - prefix[curr - k])
        if curr not in prefix:
            prefix[curr] = i
            
    if total > 0 and k > total:
        cycles = k // total
        rem = k % total
        part = smallest_subarray_infinite(arr, rem) if rem else 0
        return cycles * n + part if part != -1 else -1
    return min_len if min_len != float('inf') else -1
#Q2
def max_distance(starts, d):
    starts.sort()
    
    def feasible(dist):
        last = starts[0]
        for x in starts[1:]:
            pick = max(x, last + dist)
            if pick > x + d:
                return False
            last = pick
        return True
    lo, hi, ans = 0, max(starts) + d, 0
    while lo <= hi:
        mid = (lo + hi) // 2
        if feasible(mid):
            ans = mid
            lo = mid + 1
        else:
            hi = mid - 1
    return ans
#Q3
MOD = 10**9 + 7
def special_values_sum(arr, k):
    n = len(arr)
    dp = [0] * (k + 1)
    dp[0] = 1
    total = 0
    
    for val in arr:
        for j in range(k, val - 1, -1):
            dp[j] = (dp[j] + dp[j - val]) % MOD
        total = (total + dp[k]) % MOD
    
    return (dp[k] - 1 + MOD) % MOD
Q1)
#include <bits/stdc++.h>
 using namespace std;
int smallest_subarray_infinite(vector<int>& arr, int k) {
     int n = arr.size();
     int total = accumulate(arr.begin(), arr.end(), 0);
    unordered_map<int, int> prefix;
     prefix[0] = -1;
     int curr = 0, min_len = INT_MAX;
    for (int i = 0; i < 2 * n; ++i) {
         curr += arr[i % n];
         if (prefix.count(curr - k))
             min_len = min(min_len, i - prefix[curr - k]);
         if (!prefix.count(curr))
             prefix[curr] = i;
     }
    if (total > 0 && k > total) {
         int cycles = k / total;
         int rem = k % total;
         int part = rem ? smallest_subarray_infinite(arr, rem) : 0;
         return (part != -1) ? cycles * n + part : -1;
     }
     return (min_len == INT_MAX) ? -1 : min_len;
 }
int main() {
     int n, k;
     cin >> n >> k;
     vector<int> arr(n);
     for (int i = 0; i < n; ++i) cin >> arr[i];
     cout << smallest_subarray_infinite(arr, k) << endl;
     return 0;
 }
Q2)
#include <bits/stdc++.h>
 using namespace std;
bool feasible(vector<int>& starts, int d, int dist) {
     int last = starts[0];
     for (int i = 1; i < starts.size(); ++i) {
         int pick = max(starts[i], last + dist);
         if (pick > starts[i] + d) return false;
         last = pick;
     }
     return true;
 }
int max_distance(vector<int>& starts, int d) {
     sort(starts.begin(), starts.end());
     int lo = 0, hi = *max_element(starts.begin(), starts.end()) + d, ans = 0;
     while (lo <= hi) {
         int mid = (lo + hi) / 2;
         if (feasible(starts, d, mid)) {
             ans = mid;
             lo = mid + 1;
         } else {
             hi = mid - 1;
         }
     }
     return ans;
 }
int main() {
     int n, d;
     cin >> n >> d;
     vector<int> starts(n);
     for (int i = 0; i < n; ++i) cin >> starts[i];
     cout << max_distance(starts, d) << endl;
     return 0;
 }
Q3)
#include <bits/stdc++.h>
 using namespace std;
 const int MOD = 1e9 + 7;
int special_values_sum(vector<int>& arr, int k) {
     vector<int> dp(k + 1, 0);
     dp[0] = 1;
     for (int val : arr) {
         for (int j = k; j >= val; --j) {
             dp[j] = (dp[j] + dp[j - val]) % MOD;
         }
     }
     return (dp[k] - 1 + MOD) % MOD;
 }
int main() {
     int n, k;
     cin >> n >> k;
     vector<int> arr(n);
     for (int i = 0; i < n; ++i) cin >> arr[i];
     cout << special_values_sum(arr, k) << endl;
     return 0;
 }