--- tags: LQDOJ title: Ước lớn nhất license: Public domain --- <style> .markdown-body { max-width: 2048px; } </style> $\Huge \text{🌱 Ước lớn nhất}$ ----- ###### 🔗 Link: [https://lqdoj.edu.vn/problem/maxdivisor](https://lqdoj.edu.vn/problem/maxdivisor) ###### 👤 Writter: @SaKaTaK27 , @phanhuykhang ###### 📋 Content: [TOC] ----- ## Hướng dẫn - Giả sử n phân tích thành thừa số nguyên tố có dạng: ***p~1~^k1^.p~2~^k2^...p~n~^kn^ (p~1~ < p~2~ < ... < p~n~)*** => Ước lớn nhất của n mà khác 1 và chính nó là ***p~1~^k1-1^.p~2~^k2^...p~n~^kn^ = ***p~1~^k1^.p~2~^k2^...p~n~^kn^/p~1~ = n / p~1~****** => Việc còn lại của chúng ta là đi tìm **p~1~** => TH n là số nguyên tố hoặc n = 1 thì in ra -1(vì số nguyên tố chỉ có 2 ước là 1 và chính nó còn số 1 chỉ có 1 ước là 1) - Thiết lập sàng nguyên tố đến 10^7^ đồng thời push_back tất cả các số nguyên tố trong khoảng [1, 10^7^] vào vector p - Rồi xử lí với mỗi truy vấn, ta duyệt hết mảng p xem có phần tử nào đầu tiên mà n % p[i] == 0 hay không ? nếu có thì p[i] đầu tiên chính là p~1~ => n / p[i] chính là ước lớn nhất của n mà khác 1 và chính nó còn không có thì xuất ra -1 (TH không tồn tại số nào thỏa mãn) ----- ### Simple Code > **Lần đầu viết Hint nên có j sai sót xin mọi người đóng góp ạ > [Link đóng góp ý kiến](https://www.facebook.com/iubannhiuqua/)** > **Code chỉ mang tính chất tham khảo, xin đừng chép code** > [color=lightgreen] :::success :::spoiler Code ```cpp #include<bits/stdc++.h> using namespace std; #define FOR(i, a, b) for(int i=(a), _b=(b); i<_b; ++i) #define fi first #define se second #define pb push_back #define ll long long #define sz(a) a.size() #define all(a) a.begin(),a.end() const int N = 1 + 1e7; const int INF = 1e9; int t; vector <int> p; vector <bool> prime(N + 9, true); void sang() { p.pb(2); for(ll i = 3; i <= N; i += 2) if(prime[i] == true) { p.pb(i); for(ll j = i * i; j <= N; j += i * 2) prime[j] = false; } } void solve() { ll n; cin >> n; for(auto i : p) { if(i * i > n) // => n là số nguyên tố vì n không có ước nguyên tố từ 1 -> sqrt(n) break; if(n % i == 0) { cout << n / i << '\n'; return; // kết thúc hàm } } cout << -1 << '\n'; } int32_t main() { ios_base::sync_with_stdio (false); cin.tie(NULL); cout.tie(NULL); sang(); cin >> t; while(t--) solve(); return 0; }