11.25 週一日常

move_quiet發表於2024-11-26

11.25 週一 日常
Q1. 1200 給定x,y,k,k次操作,每次操作:x++,若x可被y整除,x一直除以y。問最終x的值。(x,y,k≤1e9)
Q2. 1400 給定一等差數列a,每次操作:令最大值=mex{a}。問是否可以將a變成0~n-1的排列和最小操作次數。(1e18)
Q3. 1600 給定一陣列和lim,設操作l,r:i:l->r,令s=0,s+=a[i];每一步如果s>lim,s=0。問使s最終不為0,l,r的方案數。

A1. 補 A2. 37mins-44mins A3. 補
A1. 加速操作:每次讓x加到下一個能被y整除到的值。在O(log(x))內x=1,即關鍵點。發現繼續操作答案有規律1,2,3,...,y-1。
A2. 數學推式子,公差不為0時發現答案為(c+(b-1)*n)/b (判上限且需要__int128) / n-max(0,1+(n-c-1)/b),公差為0時,即n個相同的數,模擬一下發現n<=c+2時有解,再分類討論答案。
A3. 令f[i]:左端點選擇i的合法方案數,j為右側最近使s==0的點。轉移:f[i]=f[j+1]+j-i; 答案就是f[i]的和。二分加字首和找j,邊界細節。

A1.

#include <bits/stdc++.h>
#define int long long //
#define endl '\n'     //
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
const int mod = 998244353;
const int N = 10 + 5e5;
void _();
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    cin >> t;
    while (t--)
        _();
    return 0;
}

//  補
void _()
{
    int x, y, k;
    cin >> x >> y >> k;
    while (x - 1)
    {
        int cnt = min(k, y - x % y);
        k -= cnt;
        x += cnt;
        while (x % y == 0)
            x /= y;
        if (!k)
            break;
    }
    if (k)
    {
        k %= y - 1;
        x = k + 1;
    }
    cout << x << endl;
}

//  1.
// void _()
// {
//     int x, y, k;
//     cin >> x >> y >> k;
//     while (x - 1)
//     {
//         int cnt = y - x % y;
//         if (cnt <= k)
//         {
//             k -= cnt;
//             x += cnt;
//             while (x % y == 0)
//                 x /= y;
//         }
//         else
//             break;
//     }
//     if (k)
//     {
//         if (x - 1)
//             x += k;
//         else
//         {
//             k %= y - 1;
//             x = k + 1;
//         }
//     }
//     cout << x << endl;
// }

**A2. **

#include <bits/stdc++.h>
// #define int long long //
#define int __int128
#define endl '\n' //
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
const int mod = 998244353;
const int N = 10 + 5e5;
void _();

int re()
{
    int s = 0, f = 1;
    char ch = getchar();
    while (ch > '9' || ch < '0')
    {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while ('0' <= ch && ch <= '9')
        s = s * 10 + ch - 48, ch = getchar();
    return s * f;
}
void wr(int s)
{
    if (s < 0)
        putchar('-'), s = -s;
    if (s > 9)
        wr(s / 10);
    putchar(s % 10 + 48);
}
void wr(int s, char ch) { wr(s), putchar(ch); }
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    t = re();
    while (t--)
        _();
    return 0;
}

//  37min-44min
void _()
{
    int n, b, c;
    n = re(), b = re(), c = re();
    // cin >> n >> b >> c;
    int res = 0; // n - max(0ll, 1 + (n - c - 1) / b)
    if (b)
        res = min(n, (c + (b - 1) * n) / b);
    else
    {
        if (n <= c + 2)
        {
            res = n;
            if (n > c)
                res--;
        }
        else
            res = -1;
    }
    wr(res, '\n');
}

A3.

#include <bits/stdc++.h>
#define int long long //
#define endl '\n'     // 互動/除錯 關
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
void _();
signed main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int T = 1;
    cin >> T;
    while (T--)
        _();
    return 0;
}

//  補
void _()
{
    int n, k;
    cin >> n >> k;
    vector<int> a(n + 1), pre(n + 2);
    for (int i = 1; i <= n; i++)
        cin >> a[i], pre[i] = pre[i - 1] + a[i];
    vector<int> f(n + 3);
    int res = 0;
    for (int i = n; i; i--)
    {
        int l = i - 1, r = n + 1;
        while (r - l - 1)
        {
            int mid = l + r >> 1;
            if (pre[mid] - pre[i - 1] > k)
                r = mid;
            else
                l = mid;
        }
        res += f[i] = f[r + 1] + r - i;
    }
    cout << res << endl;
}