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;
}