# UVA 10444

271人阅读 评论(0)

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;
}

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：2907次
• 积分：272
• 等级：
• 排名：千里之外
• 原创：25篇
• 转载：0篇
• 译文：0篇
• 评论：0条
评论排行