using
System;
class
GFG{
public
static
int
cntN1X(String str,
int
len,
int
K,
int
cntOne,
int
[,,,]dp,
int
KOne,
int
tight)
{
if
(len == str.Length)
{
return
(KOne == 1) ? 1 : 0;
}
if
(dp[len, cntOne, KOne, tight] != -1)
{
return
dp[len, cntOne, KOne, tight];
}
int
end = (tight == 1) ?
(str[len] -
'0'
) : 1;
int
res = 0;
for
(
int
i = 0; i <= end; i++)
{
int
temp = (i == 1) ? (cntOne + 1) : 0;
res += cntN1X(str, len + 1, K, temp, dp,
(
int
)(KOne | ((temp == K) ? 1 : 0)),
(
int
)(tight & ((i == end) ? 1 : 0)));
}
return
dp[len, cntOne, KOne, tight] = res;
}
public
static
int
cntN1XL_R(
int
L,
int
R,
int
K)
{
String Ls = Convert.ToString(L - 1, 2);
String Rs = Convert.ToString(R, 2);
int
[,,,]dp =
new
int
[ 32, 32, 2, 2 ];
for
(
int
i = 0; i < 32; i++)
for
(
int
j = 0; j < 32; j++)
for
(
int
k = 0; k < 2; k++)
for
(
int
l = 0; l < 2; l++)
dp[i, j, k, l] = -1;
int
resL = cntN1X(Ls, 0, K, 0, dp, 0, 1);
for
(
int
i = 0; i < 32; i++)
for
(
int
j = 0; j < 32; j++)
for
(
int
k = 0; k < 2; k++)
for
(
int
l = 0; l < 2; l++)
dp[i, j, k, l] = -1;
int
resR = cntN1X(Rs, 0, K, 0, dp, 0, 1);
return
(resR - resL);
}
public
static
void
Main(String []args)
{
int
L = 8;
int
R = 100;
int
K = 3;
Console.WriteLine(cntN1XL_R(L, R, K));
}
}