---
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;
}