input: from typing import List
  from math import gcd
  from bisect import bisect_left
  def lcm(a: int, b: int) -> int:
      return a * b // gcd(a, b)
  def find_kth_smallest(coins: List[int], k: int) -> int:
      """
      You are given an integer array coins representing coins of different denominations and an integer k.
  
      You have an infinite number of coins of each denomination. However, you are not allowed to combine coins of different denominations.
  
      Return the kth smallest amount that can be made using these coins.
  
      Examples:
      >>> coins = [3,6,9], k = 3
      9
      >>> coins = [5,2], k = 7
      12
  
      Constraints:
      1 <= coins.length <= 15
      1 <= coins[i] <= 25
      1 <= k <= 2 * 10^9
      coins contains pairwise distinct integers.
      """
  
output:     coins.sort()
      if k == 1:
          return coins[0]
      
      possible_amounts = set()
      for coin in coins:
          possible_amounts.add(coin)
      
      current_lcm = coins[0]
      for i in range(1, len(coins)):
          current_lcm = lcm(current_lcm, coins[i])
          for j in range(1, current_lcm // coins[i] + 1):
              possible_amounts.add(coins[i] * j)
      
      sorted_amounts = sorted(possible_amounts)
      return sorted_amounts[k-1]