您的位置:首页 > 其它

UVa 10288 (期望) Coupons

2014-12-23 16:56 477 查看
题意:

每张彩票上印有一张图案,要集齐n个不同的图案才能获奖。输入n,求要获奖购买彩票张数的期望(假设获得每个图案的概率相同)。

分析:

假设现在已经有k种图案,令s = k/n,得到一个新图案需要t次的概率为:st-1(1-s);

因此,得到一个新图案的期望为(1-s)(1 + 2s + 3s2 + 4s3 +...)

下面求上式中的级数:



#include <iostream>
#include <sstream>
#include <cstdio>
using namespace std;
typedef long long LL;

LL gcd(LL a, LL b)
{
if(b == 0) return a;
return gcd(b, a % b);
}

LL lcm(LL a, LL b)
{
return a / gcd(a, b) * b;
}

int LL_length(LL x)
{
stringstream ss;
ss << x;
return ss.str().length();
}

void print_chars(char c, int n)
{
for(int i = 0; i < n; ++i)
putchar(c);
}

void output(LL a, LL b, LL c)
{
if(b == 0)
{
printf("%lld\n", a);
return;
}
int l = LL_length(a);
print_chars(' ', l+1);
printf("%lld\n", b);
printf("%lld ", a);
print_chars('-', LL_length(c));
printf("\n");
print_chars(' ', l+1);
printf("%lld\n", c);
}

int main()
{
int n;
while(scanf("%d", &n) == 1)
{
if(n == 1)
{
puts("1");
continue;
}
LL x = 1, a = n + 1, b = 0, c;
for(int i = 2; i <= n-1; ++i)
x = lcm(x, i);
c = x;
x *= n;
for(int i = 2; i <= n-1; ++i)
b += x / i;
a += b / c;
LL g = gcd(b, c);
b /= g, c /= g;
b %= c;
output(a, b, c);
}

return 0;
}


代码君
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: