牛客周赛 Round 101

A 题解的token计算

直接算即可。

参考代码

void solve() {
    ld n;
    cin >> n;
    cout << 150.0 * log(n) << "\n";
}

B 76修地铁

直接算即可。

参考代码

void solve() {
    int n;
    int a, b, c, d;
    cin >> n;
    a = n / 5 * 2;
    b = (n + 5) / 10;
    c = n / 20 * 3;
    d = (n - n / 20) * 2;
    cout << a << " " << b << " " << c << " " << d << "\n";
}

C 76选数

显然每个数位都能放上1。

参考代码

void solve() {
    ll n;
    cin >> n;
    cout << (1ll << __lg(n) + 1) - 1 << "\n";
}

D 76构造

用2的幂单独作为区间组成k,剩下的数字组成一个区间,gcd为1。

参考代码

void solve() {
    int n, m;
    cin >> n >> m;

    if ((m & 1) == 0) {
        cout << -1 << "\n";
        return;
    }

    for (int b = 0; b < 31; ++b) {
        if ((m >> b & 1LL) && (1LL << b) > n) {
            cout << -1 << "\n";
            return;
        }
    }

    vector<int> bits;
    for (int b = 1; (1LL << b) <= n; ++b) {
        if (m & (1LL << b)) {
            bits.pb(b);
        }
    }


    vector<bool> used(n + 1, 0);
    for (int b : bits) {
        used[1 << b] = 1;
    }

    vector<int> perm;
    for (int b : bits) {
        perm.pb(1 << b);
    }
    for (int x = 1; x <= n; ++x) {
        if (!used[x]) {
            perm.pb(x);
        }
    }

    for (int i = 0; i < n; ++i) {
        cout << perm[i] << " ";
    }
    cout << "\n";

    int k = bits.size() + 1;
    cout << k << "\n";

    for (int i = 1; i <= bits.size(); ++i) {
        cout << i << " " << i << "\n";
    }
    cout << bits.size() + 1 << " " << n << "\n";
}

E qcjj寄快递

计算题,直接算即可。

参考代码

void solve() {
    int n;
    cin >> n;
    vector<pair<ld, ld>> cor(n);
    for (int i = 0; i < n; ++i) {
        cin >> cor[i].fi >> cor[i].se;
    }

    ld tot = 0;
    for (int i = 1; i < n; ++i) {
        ld dx = cor[i].fi - cor[i - 1].fi;
        ld dy = cor[i].se - cor[i - 1].se;
        ld dis = sqrt(dx * dx + dy * dy);

        if (dis * log(2.0) > 1.0) {
            ld k = log(dis * log(2.0)) / log(2.0);
            tot += 2 * k + 2 / log(2.0);
        } else {
            tot += 2 * dis;
        }
    }
    cout << tot << "\n";
}

F 幂中幂plus

显然会出现循环,只有mod个状态,模拟到出现重复数字即可。

参考代码

void solve() {
    ll a, c0, mod;
    cin >> a >> c0 >> mod;
    int q;
    cin >> q;
    vector<ll> qs(q);
    for (int i = 0; i < q; ++i) {
        cin >> qs[i];
    }

    if (mod == 1) {
        while (q--) {
            cout << 0 << "\n";
        }
        return;
    }

    vector<ll> c, sum, pos(mod, -1);

    ll cur = c0;
    int idx = 0, st = -1, len = -1;
    while (true) {
        ll v = ksm(a, cur, mod);
        if (pos[v] == -1) {
            pos[v] = idx++;
            c.pb(v);
            sum.pb(((sum.empty() ? 0 : sum.back()) + v) % mod);
            cur = v;
        } else {
            st = pos[v];
            len = idx - st;
            break;
        }
    }

    int pre = st;
    int cyc = len;
    ll asum = (sum[pre + cyc - 1] - (pre ? sum[pre - 1] : 0) + mod) % mod;

    for (auto v : qs) {
        if (v <= pre) {
            cout << sum[v - 1] << "\n";
        } else {
            ll cnt = (v - pre) / cyc, rem = (v - pre) % cyc;
            ll ans = pre ? sum[pre - 1] : 0;
            ans = (ans + (cnt % mod) * asum) % mod;
            if (rem) {
                ll extra = (sum[pre + rem - 1] - (pre ? sum[pre - 1] : 0) + mod) % mod;
                ans = (ans + extra) % mod;
            }
            cout << ans << "\n";
        }
    }
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
下一篇