ГЖО 7-8 класс 2019 год
Задача H. Легкая математика
У Абая есть натуральное число $n$. Он может делать с этим числом 2 вида операций: 1) Умножить $n$ на $x$ ($x$ — любое натуральное число) 2) Заменить $n$ на $\sqrt{n}$ (в этом случае $\sqrt{n}$ должно быть целым числом) Обе операции можно делать любое количество раз. Помогите Абаю узнать, какое минимальное число можно получить, выполняя данные операции. Также Абая интересует, какое минимальное количество операций нужно проделать, чтобы получить минимальное число.
20Ответ
10 2Вход
5184Ответ
6 4
Комментарий/решение:
//ZA
#include <bits/stdc++.h>
#define o cout<<"Hello did you expect this?"<<endl;
#define ll long long
#define pb push_back
#define mp make_pair//with Z
#define F first
#define S second
using namespace std;
const int N = 2e5 + 100;
const int mod = 1e9 + 7;
void hey () {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
int main () {
hey();
int x;
cin >> x;
map<int,int> was;
vector<int> factors;int wow = x;
for (int i = 2; i <= sqrt(x); i++) {
while (x % i == 0) {
factors.push_back(i);
x /= i;
}
}
if (x != 1) {
factors.push_back(x);
}
bool hm2 = 0;
for (int i = 0; i < factors.size(); i++) {
was[factors[i]]++;
if (was[factors[i]] > 1) {
hm2 = 1;
}
}
if (hm2) {
int ans = 0;
int dov = 0;
for (int i = 1; i <= 30; i++) {
int k = (1 << i);
bool no = 0;
bool was2 = 0;
for (int i = 0; i < factors.size(); i++) {
if (k < was[factors[i]]) {
no = 1;
}
if (k > was[factors[i]]) {
was2 = 1;
}
}
if (!no) {
ans = i;
if (was2) {
ans++;
}
break;
}
}
int hm = 1;
for (int i = 1; i <= 1e4; i++) {
if (was[i]) {
hm *= i;
}
}
cout << hm << " " << ans;
}
else {
cout << wow << " " << 0;
}
}
Можно было лучше написать конечно.
Обьяснения кода:
Есть теорема
N = p1 ^ k1 * p2 ^ k2 * p3 ^ k3......
p1, p2, p3= простые числа(различные)
k1, k2, k3(сколько они раз встречаются в разложение числа N)
по этой теореме верно то что
sqrt(N) = p1 ^ (k1 / 2) * p2 ^ (k2 / 2) * p3 ^ (k3 / 2)
k1, k2, k3 должны делиться на 0.
А ответ будет равняться произведению всех простых чисел. И значит мы можем умножить наше число N чтобы k1, k2, k3.. было степень двойки. После этого мы можем просто пока у нас k1, k2, k3 != 1 делать sqrt(N) то есть из за этого у нас ответ log2 + 1 или просто log2
Возможно, что при неправильном наборе формул, они будут
доредактированы модератором. При этом содержание не будет меняться.