Thinking: This question is quite easy if you read it more carefully and actually the problem has already told you how to solve it.
Tip : Since sometimes factorial(n) can be quite large, long long int should be used to avoid run time error.
AC code:
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define MIN(a,b) ((a)<(b)?(a):(b))
#define lli long long int
using namespace std;
lli fac(lli n)
{
lli result = 1;
for (lli i = 1; i <= n; i++)
result *= i;
return result;
}
lli combination(int n, int r)
{
if (r == 0||n == r)
return 1;
if (r > n)
return 0;
lli facn = fac(n);
lli facr = fac(r);
lli facnmr = fac(n - r);
return facn /(facr*facnmr);
}
int main()
{
//freopen("in.txt", "r", stdin);
int n, p;
int T = 0;
while (scanf("%d%d", &n, &p) && (n || p))
{
T++;
if (n == 0)
{
printf("Case %d: %d\n", T, 0);
continue;
}
int result = 0;
int moved = 0;
for (int k = 0; 1; k++)
{
int num = combination(p - 3 + k, MIN(k, p - 3));
int cost = 1 << k;
if (moved + num >= n)
{
int remain = n - moved;
result += cost*remain;
break;
}
else
{
moved += num;
result += cost*num;
}
}
printf("Case %d: %d\n", T, result);
}
return 0;
}