More problems

This commit is contained in:
2026-04-03 14:51:26 -03:00
parent 6fcf7fa298
commit ab40694aa7
22 changed files with 2716 additions and 96 deletions

View File

@@ -78,37 +78,12 @@ auto operator>>(istream &is, vector<vector<v>> &vec)->istream& {
const int oo = INT32_MAX >> 1;
const ll OO = INT64_MAX >> 1;
constexpr int MAXN = 5e4 + 10;
int di[MAXN];
vi divs[MAXN];
vi primes;
ll p[] = {1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113};
int ps = sizeof(p) / sizeof(ll);
void pre()
{
// fill(di, di + MAXN, 1);
// iota(di, di + MAXN, 0);
// primes.push_back(1);
// nrep(i, 2, MAXN) {
// if (di[i] != i) {
// continue;
// }
// primes.push_back(i);
//
// for (int j = i; j < MAXN; j += i) {
// di[j] = i;
// }
// }
// nrep(i, 2, MAXN) {
// int cur = i;
// while (cur > 1) {
// int now = di[i];
// divs[i].push_back(now);
// while (di[i] == now) {
// i /= now;
// }
// }
// }
}
#define TEST 1
@@ -117,87 +92,101 @@ void solve()
{
int n;
cin >> n;
vl a(n);
vl b(n);
cin >> a >> b;
// vl act(n);
// act[0] = gcd(a[0], a[1]);
// act[n - 1] = gcd(a[n - 1], a[n - 2]);
//
// nrep(i, 1, n - 1) {
// ll g1 = gcd(a[i], a[i + 1]);
// ll g2 = gcd(a[i], a[i - 1]);
//
// act[i] = lcm(g1, g2);
// }
//
priority_queue<pair<int, int>> pq;
rep(i, n) {
pq.emplace(b[i], i);
vl act(n);
V<bool> rem(n);
act[0] = gcd(a[0], a[1]);
if (act[0] > b[0]) {
act[0] = a[0];
}
int act = 0;
if (act[0] != a[0]) {
rem[0] = true;
}
act[n - 1] = gcd(a[n - 1], a[n - 2]);
if (act[n - 1] > b[n - 1]) {
act[n - 1] = a[n - 1];
}
// ll t = gcd(a[0], a[1]);
// if (t != a[0] && t <= b[0]) {
// a[0] = t;
// act++;
// }
// t = gcd(a[n - 1], a[n - 2]);
// if (t != a[n - 1] && t <= b[n - 1]) {
// a[n - 1] = t;
// act++;
// }
if (act[n - 1] != a[n - 1]) {
rem[n - 1] = true;
}
while (!pq.empty()) {
auto [bi, i] = pq.top();
pq.pop();
ll g1 = i == n - 1 ? 1 : gcd(a[i], a[i + 1]);
ll g2 = i == 0 ? 1 : gcd(a[i], a[i - 1]);
ll bs = lcm(g1, g2);
int low = 1;
int high = 1e9;
int ans = 0;
while (low <= high) {
int mid = (low + high) >> 1;
if (bs * mid <= b[i]) {
ans = mid;
low = mid + 1;
continue;
}
high = mid - 1;
}
if (ans == 0) {
nrep(i, 1, n - 1) {
act[i] = lcm(gcd(a[i], a[i - 1]), gcd(a[i], a[i + 1]));
if (act[i] > b[i]) {
act[i] = a[i];
continue;
}
ll t1 = i == n - 1 ? 1 : a[i + 1] / g1;
ll t2 = i == 0 ? 1 : a[i - 1] / g2;
// ll lc = lcm(t1, t2);
// while (ans > 0 && (t1 % primes[ans] == 0 || t2 % primes[ans] == 0 || primes[ans] * bs == a[i])) {
// ans--;
// }
if (ans % t1 == 0) {
ans /= t1;
if (act[i] != a[i]) {
rem[i] = true;
}
if (ans % t2 == 0) {
ans /= t2;
}
act += bs * ans != a[i];
a[i] = bs * ans;
}
cout << act << '\n';
vvl dp(n, vl(ps, -OO));
dp[0][0] = rem[0];
if (!rem[0]) {
rep(i, ps) {
ll cur = p[i] * act[0];
if (cur > b[0]) {
break;
}
dp[0][i] = (cur != a[0]);
}
}
nrep(i, 1, n) {
ll bf = act[i - 1] / gcd(act[i - 1], act[i]);
ll nw = act[i] / gcd(act[i - 1], act[i]);
if (rem[i]) {
dp[i][0] = dp[i - 1][0] + 1;
nrep(k, 1, ps) {
if (nw % p[k] != 0) {
rmax(dp[i][0], dp[i - 1][k] + 1);
}
}
continue;
}
dp[i][0] = dp[i - 1][0];
nrep(k, 1, ps) {
if (nw % p[k] == 0) {
continue;
}
rmax(dp[i][0], dp[i - 1][k]);
}
nrep(j, 1, ps) {
if (act[i] * p[j] > b[i]) {
break;
}
if (bf % p[j] == 0) {
continue;
}
rmax(dp[i][j], dp[i - 1][0] + (act[i] * p[j] != a[i]));
nrep(k, 1, ps) {
if (j == k || nw % p[k] == 0) {
continue;
}
rmax(dp[i][j], dp[i - 1][k] + (act[i] * p[j] != a[i]));
}
}
}
cout << max(*max_element(all(dp[n - 1])), 0LL) << '\n';
}
int main()