338
Se consideră un număr natural N care este par.
Cerința
Să se determine cel mai mic număr natural impar M care are același număr de divizori ca și N.
Date de intrare
Programul citește de la tastatură numărul N.
Date de ieșire
Programul va afișa pe ecran cel mai mic număr natural impar M care are același număr de divizori ca și N.
Restricții și precizări
1 ≤ N ≤ 1 000 000 000și este par- Se garantează că
Mva fi mai mic decât2 000 000 000
Exemplu
Intrare
360
Ieșire
3465
Explicație
360 are 24 de divizori. Cel mai mic număr impar care are tot 24 de divizori este 3465.
#include <bits/stdc++.h>
using namespace std;
#define Inf 2000000000
int nrd[101], n;
long long minim = Inf;
int prime[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};
long long calcnr (int ind)
{
int aux;
long long nr = 1;
for (int i = ind, l = 1; i >= 1; i --, l ++)
{
aux = nrd[i];
while (aux > 1)
{
nr *= prime[l];
aux --;
if (nr > Inf)return Inf;
}
}
return nr;
}
void back(int x, int ind)
{
if (x == 1)
{
minim = min(minim, calcnr(ind));
return;
}
nrd[ind + 1] = x;
back(1, ind + 1);
for(int i = 0; prime[i] * prime[i] <= x && prime[i] <= x/prime[i]; i ++)
if (x % prime[i] == 0)
{
nrd[ind + 1] = prime[i];
back(x / prime[i], ind + 1);
}
}
int main()
{
cin >> n;
int div = 2, nrdiv = 1, x;
while(n > 1)
{
if(n % div == 0)
{
x = 0;
while(n % div == 0) x++ , n /= div;
nrdiv *= (x + 1);
}
div ++;
}
back(nrdiv, 0);
cout << minim;
return 0;
}
Comentarii