UVA 10444

来源:互联网 发布:广州拓飞数据恢复公司 编辑:程序博客网 时间:2024/06/03 19:38

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 intusing 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
原创粉丝点击