天天看點

10288 - Coupons (數學期望)

沒什麼好說的了,看代碼吧:

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
int n,m;
ll gcd(ll a,ll b) {
    return b == 0 ? a : gcd(b,a%b);
}
int gainLen(ll a) {
    int cnt = 0;
    while(a > 0) {
        a /= 10; cnt++;
    }
    return cnt;
}
int main() {
    while(~scanf("%d",&n)) {
        ll u = 1 , v = 1;
        for(int i=2;i<=n;i++) {
            u *= i; u += v; v *= i;
            ll c = gcd(u,v);
            u /= c; v /= c;
        }
        u *= n;
        ll c = gcd(u,v);
        u /= c; v /= c;
        if(u % v == 0) printf("%lld\n",u/v);
        else {
            ll a = u / v;
            u -= a*v;
            int len = gainLen(a);
            int len2 = gainLen(v);
            for(int i=0;i<=len;i++) printf(" ");
            printf("%lld\n%lld ",u,a);
            for(int i=0;i<len2;i++) printf("-");
            printf("\n");
            for(int i=0;i<=len;i++) printf(" ");
            printf("%lld\n",v);
        }
    }
    return 0;
}