P1291 [SHOI2002]百事世界杯之旅(概率)
设$f(n,k)$表示共n个名字,剩下k个名字未收集到,还需购买饮料的平均次数
则有:
$f(n,k)=\frac{n-k}{n}*f(n,k) + \frac{k}{n}*f(n,k+1) +1$
移项整理,可得:
$f(n,k)=f(n,k+1)+\frac{n}{k}$
根据递推式,可得:
$f(n,0)=n\sum_{k=1}^{n}\frac{1}{k}$
蓝后gcd搞搞约分
注意输出
end.
#include<iostream> #include<cstdio> #include<cstring> #define re register using namespace std; typedef long long ll; ll p,q=1,g; int n; ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} int wid(ll x){//计算位数 int res=0; for(;x;x/=10)++res; return res; } int main(){ scanf("%d",&n); for(re int i=1;i<=n;++i){ p=p*i+q*n; q*=i; g=gcd(p,q); p/=g,q/=g; }g=p/q,p%=q;
//分多种情况输出 if(!p) printf("%lld",g); else{ for(re int i=wid(g);i>=1;--i) putchar(' '); printf("%lld\n",p); if(g) printf("%lld",g); for(re int i=wid(q);i>=1;--i) putchar('-'); putchar('\n'); for(re int i=wid(g);i>=1;--i) putchar(' '); printf("%lld",q); }return 0; }