ГЖО 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
Возможно, что при неправильном наборе формул, они будут
доредактированы модератором. При этом содержание не будет меняться.