CF300E Empire Strikes Back
Empire Strikes Back
题目描述
给定
Solution
考虑先对
考虑怎么对
时间复杂度大概是比
Code
// Cirno is not baka!
#include <bits/stdc++.h>
#define For(i, a, b) for (int i = (a); i <= (int)(b); ++i)
#define Rof(i, a, b) for (int i = (a); i >= (int)(b); --i)
#define FILE(filename) { \
freopen(#filename ".in", "r", stdin); \
freopen(#filename ".out", "w", stdout); \
}
#define All(x) x.begin(), x.end()
#define rAll(x) x.rbegin(), x.rend()
#define pii pair<int, int>
#define fi first
#define se second
#define i64 long long
#define i128 __int128_t
#define mkp make_pair
// #define int long long
#define epb emplace_back
#define pb push_back
using namespace std;
const int _N = 1e6 + 5, mod = 1e9 + 7, inf = 1e9, _M = 1e7 + 5;
template<typename T> void Max(T &x, T y) {x = max(x, y);}
template<typename T> void Min(T &x, T y) {x = min(x, y);}
namespace BakaCirno {
bitset<_M> flag;
vector<int> prim;
vector<i64> cnt;
void InitPrime(int n) {
For(i, 2, n) {
if (!flag[i]) prim.epb(i);
for (int j : prim) {
if (j * i > n) break;
flag[j * i] = 1;
if (i % j == 0) break;
}
}
cnt.resize(prim.size(), 0);
}
int N, A[_M];
void _() {
InitPrime(1e7);
cin >> N; A[0] = N;
int mx = 0;
For(i, 1, N) {
int x; cin >> x; Max(mx, x);
A[x + 1] -= 1;
}
For(i, 1, mx) A[i] += A[i - 1];
For(i, 0, prim.size() - 1) for (i64 j = prim[i]; j <= mx; j *= prim[i])
for (int k = j; k <= mx; k += j)
cnt[i] += A[k];
i64 L = 1, R = 1e15;
auto Check = [&](i64 x)->bool {
vector<i64> tcnt(prim.size(), 0);
For(i, 0, prim.size() - 1) for (i128 j = prim[i]; j <= x; j *= prim[i])
tcnt[i] += x / j;
For(i, 0, prim.size() - 1)
if (tcnt[i] < cnt[i]) return 0;
return 1;
};
while (L <= R) {
i64 mid = (L + R) >> 1;
if (Check(mid)) R = mid - 1;
else L = mid + 1;
}
cout << L << '\n';
}
}
signed main() {
// FILE(test);
cin.tie(0)->sync_with_stdio(0); int T = 1;
// cin >> T;
while (T--) BakaCirno::_();
// fout.flush();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步