class
GFG
{
static
long
discard_count =
0
;
static
long
power(
long
a,
long
n)
{
if
(n ==
0
)
return
1
;
long
p = power(a, n /
2
);
p = p * p;
if
(n %
2
==
1
)
p = p * a;
return
p;
}
static
void
solve(
int
i,
int
n,
float
sum,
float
k,
float
[]a,
float
[]prefix)
{
if
(sum > k)
{
discard_count += power(
2
, n - i);
return
;
}
if
(i == n)
return
;
float
rem = prefix[n -
1
] - prefix[i];
if
(sum + a[i] + rem > k)
solve(i +
1
, n, sum + a[i], k,
a, prefix);
if
(sum + rem > k)
solve(i +
1
, n, sum, k, a, prefix);
}
static
int
countSubsequences(
int
[]arr,
int
n,
long
K)
{
float
sum =
0
.0f;
float
k = (
float
) Math.log(K);
float
[]prefix =
new
float
[n];
float
[]a =
new
float
[n];
for
(
int
i =
0
; i < n; i++)
{
a[i] = (
float
) Math.log(arr[i]);
sum += a[i];
}
prefix[
0
] = a[
0
];
for
(
int
i =
1
; i < n; i++)
{
prefix[i] = prefix[i -
1
] + a[i];
}
long
total = power(
2
, n) -
1
;
if
(sum <= k)
{
return
(
int
) total;
}
solve(
0
, n,
0
.0f, k, a, prefix);
return
(
int
) (total - discard_count);
}
public
static
void
main(String[] args)
{
int
arr[] = {
4
,
8
,
7
,
2
};
int
n = arr.length;
long
k =
50
;
System.out.print(countSubsequences(arr, n, k));
}
}