[hdu 6239 Interview]数学OR打表

[hdu 6239 Interview]数学OR打表

分类:Math

1. 题目链接

[hdu 6239 Interview]

2. 题意描述

题意描述

3. 解题思路

明明知道公式似乎并不是很难,但是怎么就是推不对。
最后投机取巧的打了个表,然后就很容易找出规律。
概率论太差呀,很难想象这种题目在现场赛竟然是道金牌题?

4. 实现代码

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int inf = 0x3f3f3f3f;
const ll infl = 0x3f3f3f3f3f3f3f3fLL;
template<typename T> inline void umax(T &a, T b) { a = max(a, b); }
template<typename T> inline void umin(T &a, T b) { a = min(a, b); }
void debug() { cout << endl; }
template<typename T, typename ...R> void debug (T f, R ...r) { cout << "[" << f << "]"; debug (r...); }

const ll MOD = 1e9 + 7;

ll qpow(ll a, ll b) {
    ll ret = 1;
    a %= MOD;
    while (b > 0) {
        if (b & 1) ret = ret * a % MOD;
        a = a * a % MOD;
        b >>= 1;
    }
    return ret;
}

ll solve1(ll n) {
    vector<int> r(n + 1);
    for (int i = 1; i <= n; ++i) {
        r[i] = i;
    }
    ll up = 0, dw = 0;
    do {
        for (int k = 0; k <= n; ++k) {
            if (r[1] <= k || r[2] > k) continue;
            ++ dw;
            up += (r[1] - k);
        }
    } while (next_permutation(r.begin() + 1, r.end()));
    debug(n, up, dw);
    return up * qpow(dw, MOD - 2) % MOD;
}

ll solve2(ll n) {
    vector<int> r(n + 1);
    for (int i = 1; i <= n; ++i) {
        r[i] = i;
    }
    ll up = 0, dw = 0;
    do {
        for (int k = 0; k <= n; ++k) {
            if (r[1] <= k || r[2] <= k) continue;
            ++ dw;
            up += (r[1] - k);
        }
    } while (next_permutation(r.begin() + 1, r.end()));
    debug(n, up, dw);
    return up * qpow(dw, MOD - 2) % MOD;
}


int main() {
#ifdef ___LOCAL_WONZY___
    freopen("input.txt", "r", stdin);
#endif // ___LOCAL_WONZY___
    // std::vector<ll> v(1000);
    // for(ll n = 1; n <= 15; ++n) {
    //     v[n] = solve1(n);
    // }
    // return 0;
    int T; cin >> T;
    while (T --) {
        ll n, d; cin >> n >> d;
        ll ans;
        if (d == 1) {
            ans = (n + 2) * qpow(4, MOD - 2) % MOD;
        } else {
            // ans = solve2(n);
            ans = 3ll * (n + 2) % MOD * qpow(8, MOD - 2) % MOD;
        }
        printf("%lld\n", ans);
    }
#ifdef ___LOCAL_WONZY___
    cout << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC * 1000 << "ms." << endl;
#endif // ___LOCAL_WONZY___
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ACMore_Xiong/article/details/78767571