「刷题记录」 [SHOI2002] 百事世界杯之旅

第一道有关极限期望的数学题,记录一下。

我们设 fi 是凑齐前 i 个球星期望需要买的饮料数。

E=1×nin+2×in×nin+3×(in)2×nin+4×(in)3×nin+k×(in)k1×nin

其中 k 是一个极大数,可以看作是无限,我们由此可以推出下面的式子:

inE=in×nin+2×(in)2×nin+3×(in)3×nin+4×(in)4×nin+k×(in)k×nin

相减得:

ninE=nin+innin+(in)2nin++(in)k1nink(in)knin

由于 k 为无限大,所以 k(in)knin 就无限接近于 0,所以它对答案的影响也无限接近于 0,我们可以直接将其省略,那么期望式子就变成这样了:

ninE=nin+innin+(in)2nin++(in)k1nin

将系数化为 1 得:

E=1+in+(in)2++(in)k1

这里我们可以用等比数列求和公式来做。设 S=in+(in)2++(in)k1,则 inS=(in)2+(in)3++(in)k

ninS=SinS=in(in)k

还是考虑极限,k 为无限大,则 (in)k 无限接近于 0,都答案的影响可以忽略不计,所以,

ninSinSiniE=1+S=nni

求出了期望,我们可以写出递推式:fi+1=fi+nni,转化一下,就是 fi=fi1+nn(i1)

现在,我们可以一步一步的递推过去,也可以将 fi 的式子拆开,最后得到 fn=nn+nn1++n1=n×(11+12+13+14+15++1n),两种方法都可以。

//The code was written by yifan, and yifan is neutral!!!

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define bug puts("NOIP rp ++!");
#define rep(i, a, b, c) for (int i = (a); i <= (b); i += (c))
#define per(i, a, b, c) for (int i = (a); i >= (b); i -= (c))

template<typename T>
inline T read() {
    T x = 0;
    bool fg = 0;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        fg |= (ch == '-');
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = (x << 3) + (x << 1) + (ch ^ 48);
        ch = getchar();
    }
    return fg ? ~x + 1 : x;
}

using fs = tuple<ll, ll>;

int n;

ll gcd(ll x, ll y) {
    if (y == 0) {
        return x;
    }
    return gcd(y, x % y);
}

fs operator+ (const fs& a, const fs& b) {
    ll g = gcd(get<1>(a), get<1>(b));
    ll lcm = get<1>(a) / g * get<1>(b);
    ll fza = get<0>(a), fzb = get<0>(b);
    fza *= (lcm / get<1>(a));
    fzb *= (lcm / get<1>(b));
    return fs(fza + fzb, lcm);
}

int main() {
    n = read<int>();
    fs res = fs(1, 1);
    rep (i, 2, n, 1) {
        res = res + fs(1, i);
    }
    res = fs(get<0>(res) * n, get<1>(res));
    ll num = get<0>(res) / get<1>(res);
    if (get<0>(res) % get<1>(res) == 0) {
        cout << num << '\n';
        return 0;
    }
    res = fs(get<0>(res) % get<1>(res), get<1>(res));
    int digitfz = 0, digitfm = 0, digitps = 0;
    ll tmpfz = get<0>(res), tmpfm = get<1>(res), tmpps = num;
    ll gc = gcd(tmpfz, tmpfm);
    res = fs(get<0>(res) / gc, get<1>(res) / gc);
    tmpfz = get<0>(res), tmpfm = get<1>(res), tmpps = num;
    while (tmpfz) {
        tmpfz /= 10;
        ++ digitfz;
    }
    while (tmpfm) {
        tmpfm /= 10;
        ++ digitfm;
    }
    while (tmpps) {
        tmpps /= 10;
        ++ digitps;
    }
    int maxx = max(digitfz, digitfm);
    rep (i, 1, digitps, 1) {
        cout << ' ';
    }
    cout << get<0>(res) << '\n';
    cout << num;
    rep (i, 1, maxx, 1) {
        cout << '-';
    }
    putchar('\n');
    rep (i, 1, digitps, 1) {
        cout << ' ';
    }
    cout << get<1>(res) << '\n';
    return 0;
}

作者:yifan0305

出处:https://www.cnblogs.com/yifan0305/p/17663968.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

转载时还请标明出处哟!

posted @   yi_fan0305  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示