小白月赛 Round 125 题解

https://anoth3r.top/solution/nkm125/

A 幂运算

构造 即可。

void solve() {
    int x;
    cin >> x;
    cout << x << " " << 1 << "\n";
}

B 琪露诺的 K 维偏序

二分查找数组中小于 的元素个数即可。

void solve() {
    int n, q;
    cin >> n >> q;
    vector<int> a(n);
    for (int i = 0; i < n; ++i) cin >> a[i];

    while (q--) {
        int k, x;
        cin >> k >> x;
        int pos = lower_bound(all(a), x) - a.begin();
        if (pos >= k) cout << "Yes" << "\n";
        else cout << "No" << "\n";
    }
}

C 合成大企鹅

不难发现,最后的结果为:

所以让大数尽可能少的被开根号即可。

void solve() {
    int n;
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; ++i) cin >> a[i];
    sort(all(a));
    double ans = a[0];
    for (int i = 1; i < n; ++i) {
        ans *= a[i];
        ans = sqrt(ans);
    }
    cout << ans << "\n";
}

D/E ⑨运算

因为每一位都是 ,所以最终一定为 ,且必然。因为 不改变取模结果, 会改变取模结果。

所以如果原来数字是 的倍数,那么只需要执行 ,答案为

如果不是 的倍数就在其中插入一次 ,即先做 ,再做一次 ,再做 ,即:

所以 ,最小化 即可。

vector<ll> p(19);

void init() {
    p[0] = 1;
    for (int i = 1; i <= 18; ++i) p[i] = p[i - 1] * 10;
}

void solve() {
    ll x;
    cin >> x;
    ll ans = INF;
    for (int i = 1; i <= 18; ++i) {
        ll N = p[i] - 1;
        if ((x % 9) == 0 && N >= x ) {
            ll q = (N - x) / 9;
            if (q < ans) ans = q;
        }
        if (N >= 9 * x) {
            ll S = (N - 9 * x) / 9;
            ll q = 1 + S / 9 + S % 9;
            if (q < ans) ans = q;
        }
    }
    cout << ans << "\n";
}

F 琪露诺的排列构造

如果 显然不可能。

如果 为奇数且 ,整个排列向左移动一位即可,前 项为 ,最后一项为

如果 为偶数:

  • 如果 的倍数,用 即可。
  • 否则,先构造一个 ,再拼接 块即可。

构造短块手玩一下即可。

void solve() {
    int n;
    cin >> n;
    if (n == 1 || n == 2) {
        cout << -1 << "\n";
        return;
    }
    vector<int> p(n + 1, 0);
    if (n % 2 == 1) {
        for (int i = 1; i < n; ++i) p[i] = i + 1;
        p[n] = 1;
    } else {
        if (n % 4 == 0) {
            for (int a = 1; a <= n; a += 4) {
                p[a] = a + 1;
                p[a + 1] = a + 3;
                p[a + 2] = a;
                p[a + 3] = a + 2;
            }
        } else {
            p[1] = 2;
            p[2] = 3;
            p[3] = 1;
            p[4] = 6;
            p[5] = 4;
            p[6] = 5;
            for (int a = 7; a <= n; a += 4) {
                p[a] = a + 1;
                p[a + 1] = a + 3;
                p[a + 2] = a;
                p[a + 3] = a + 2;
            }
        }
    }
    for (int i = 1; i <= n; ++i) {
        cout << p[i] << " ";
    }
    cout << "\n";
}

G 琪露诺的连续取模求和

对每个整数 依次做模

  • ,没有任何模会改变它,结果就是
  • ,当遍历到模数 时有 ,所以结果为
  • ,先做一次 (于是 )。接下来会继续使用 ,然后操作同上。

因此有:

于是对区间 求和可以分两部分:

  1. 的那段直接用等差和;
  2. 的那段只在 时贡献 ,对这段按模 的完整周期与残余计算即可(每个周期对小于 的余数贡献为
void solve() {
    int l, r, p, q;
    cin >> l >> r >> p >> q;

    auto sum = [&](int a, int b) -> ll{
        if (a > b) return 0ll;
        return 1ll * (a + b) * (b - a + 1) / 2;
    };

    auto calc = [&](int x, int p, int q) -> ll {
        if (x < 0) return 0l;
        ll n = x + 1, m = min(n % q, (ll)p);
        return 1ll * n / q * p * (p - 1) / 2 + m * (m - 1) / 2;
    };

    ll ans = 0;
    int a = l;
    int b = min(r, p - 1);
    if (a <= b) ans += sum(a, b);

    int L = max(l, p);
    if (L <= r) ans += calc(r, p, q) - calc(L - 1, p, q);
    cout << ans << "\n";
}

#头文件

//Another
#include<bits/stdc++.h>
#include<bits/extc++.h>
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
using namespace std;

typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef __int128 i128;
typedef pair<int, int> PII;
typedef pair<ll, ll> PLL;
typedef tuple<ll, ll, ll> TLLL;
typedef __gnu_pbds::tree<PLL, __gnu_pbds::null_type, less<PLL>, __gnu_pbds::rb_tree_tag, __gnu_pbds::tree_order_statistics_node_update> Tree;
// typedef __gnu_pbds::tree<ll, __gnu_pbds::null_type, less<ll>, __gnu_pbds::rb_tree_tag, __gnu_pbds::tree_order_statistics_node_update> Tree;

constexpr int inf = (ll)1e9 + 7;
constexpr ll INF = (ll)2e18 + 9;
// constexpr ll INF = (ll)4e18;
// constexpr ll MOD = 1e9 + 7;
constexpr ll MOD = 998244353;
constexpr ld PI = acos(-1.0);
constexpr ld eps = 1e-10;

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ull randint(ull l, ull r) {uniform_int_distribution<unsigned long long> dist(l, r); return dist(rng);}

void init() {

}

void solve() {

}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    init();

    int t = 1;
    cin >> t;
    for (int _ = 1; _ <= t; ++_) {
        solve();
    }

    return 0;
}