More problems
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user