题目大意: 有 n n n 种物品,每次随机拿一种,问期望拿几次能拿齐所有种类。
题解
跟这题一样的,甚至还要简单一些qwq,就是多了个分数。
代码如下:
#include <cstdio>
#define ll long long
int n;
ll gcd(ll x,ll y){return y==0?x:gcd(y,x%y);}
struct frac{
ll x,up,down;
void yuefen()
{
if(!down)return;
x+=up/down;up%=down;
ll g=gcd(up,down);
up/=g;down/=g;
}
frac(ll a=0,ll b=0,ll c=0):x(a),up(b),down(c){}
frac operator+(frac b)
{
frac re; b.yuefen();re.x=x+b.x;
re.down=down/gcd(down,b.down)*b.down;
re.up=up*(re.down/down)+b.up*(re.down/b.down);//这里不加括号你就会得到70分的好成绩
re.yuefen(); return re;
}
void print()
{
if(!up)printf("%lld",x);
else
{
ll p=x; int l=0;
while(p)p/=10,l++,printf(" ");
printf("%lld\n",up);
printf("%lld",x); p=down;while(p)p/=10,printf("-");
printf("\n"); for(int i=1;i<=l;i++)printf(" ");
printf("%lld\n",down);
}
}
}f[40];
int main()
{
scanf("%d",&n);
f[n]=frac(0,0,1);
for(int i=n-1;i>=0;i--)
f[i]=f[i+1]+frac(0,n,n-i);
f[0].print();
}