всем привет!
сегодня решал задачу B от Innopolis open 2024 1-й отборочный тур. моё решение даёт только 10 баллов а именно когда n = 2. я написал код который решает её для n = 3 но код непроходит 3-й тест. Буду рад если поможете!
моё решение
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC target("avx2")
using namespace std;
using ll = long long;
#define int ll
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
using pii = pair<int, int>;
using vi = vector<int>;
#define fi first
#define se second
#define pb push_back
const char nl = '\n';
const int N = 25000000;
const int N2 = 1000010;
int lp[N2+1];
int n, q;
map<int, int> fact(int x) {
map<int, int> ans;
while (x > 1) {
int a = lp[x];
int cnt = 0;
while (x % a == 0) {
++cnt;
x /= a;
}
ans[a] = cnt;
}
return ans;
}
int ppow(int x, int y) {
int ans = 1;
if (x == 1)return 1;
rep(i, 0, y) {
ans *= x;
if (ans > 21)return 22;
}
return ans;
}
int calc(map<int, int> f1, map<int, int> f2) {
int mx = 0;
for (auto i: f2) {
if (f1[i.fi] == 0) {
mx = N;
break;
}
if (f1[i.fi] >= i.se)continue;
int c = i.se/f1[i.fi];
if (c*f1[i.fi] < i.se)++c;
mx = max(mx, c);
}
return mx;
}
void solvefor3() {
int a, b, c;
cin >> a >> b >> c;
vector<vector<int>> f;
f.pb({a, ppow(b, ppow(b, c))});
f.pb({a, ppow(c, ppow(c, b))});
f.pb({b, ppow(c,ppow(c, a))});
f.pb({b, ppow(a,ppow(a, c))});
f.pb({c, ppow(a,ppow(a, b))});
f.pb({c, ppow(b,ppow(b, a))});
vector<int> t(q);
rep(i, 0, q)cin >> t[i];
vector ans(q, false);
for (auto i: f) {
// cout << i[0] << nl;
map<int, int> f1 = fact(i[0]);
rep(j, 0, q) {
map<int, int> f2 = fact(t[j]);
int mx = calc(f1, f2);
if (i[1] >= mx)ans[j] = true;
}
}
rep (k, 0, q) {
if (ans[k] == true)cout << "Yes\n";
else cout << "No\n";
}
}
void solve() {
vi pr;
for (int i = 2; i <= N2; ++i) {
if (lp[i] == 0) {
lp[i] = i;
pr.pb(i);
}
for (auto p: pr) {
if (p*i> N2 || lp[i] < p)break;
lp[p*i] = p;
}
}
cin >> n >> q;
if (n == 3)solvefor3();
else {
int a, b;
cin >> a >> b;
map<int, int> f1, f2, f3;
f1 = fact(a);
f2 = fact(b);
rep(j, 0, q) {
int x;
cin >> x;
f3 = fact(x);
bool ok = false;
int mx = calc(f1, f3);
if (b >= mx)ok = true;
mx = calc(f2, f3);
if (a >= mx)ok = true;
cout << (ok? "Yes" : "No") << nl;
}
}
}
int32_t main() {
ios::sync_with_stdio(0);
cin.tie(0);
int T = 1;
//cin >> T;
while (T--) {
// cout << ppow(2, 4) << nl;
solve();
}
return 0;
}
И конечно же ссылка на задачу