Rezolvare completă PbInfo #2247 NrDiv

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ă M va fi mai mic decât 2 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.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema NrDiv:

#include <bits/stdc++.h>
using namespace std;

int t[] = {0, 3,5,7,11,13,17,19,23};
int c[] = {0,15,7,6, 4, 2, 2, 2, 2};
int st[12], n, nrdiv, x;
long long nrImpar;
int d[12];

void Citire()
{
    cin >> x;
}

void NrDivizori()
{
    int i;
    nrdiv = 0;
    for (i = 1; i * i < x; ++i)
        if (x % i == 0) nrdiv += 2;
    if (i * i == x) nrdiv++;
}

inline bool Valid(int top)
{
    d[top] = d[top - 1] * (1 + st[top]);
    if (d[top] <= nrdiv) return true;
    return false;
}

inline int Putt(int a, int k)
{
    int i, x = 1;
    for (i = 1; i <= k; ++i)
        x *= a;
    return x;
}

inline void UpdateSol(int top)
{
    int i;
    long long w = 1;
    for (i = 1; i <= top; ++i)
        w *= Putt(t[i], st[i]);
    nrImpar = min(nrImpar, w);
}

inline void Back()
{
    bool cand;
    int top;
    d[0] = 1;
    top = 1;
    st[top] = 0;
    while (top > 0)
    {
        cand = false;
        while (!cand && st[top] < c[top])
        {
            st[top]++;
            cand = Valid(top);
        }
        if (!cand) top--;
        else if (d[top] == nrdiv) UpdateSol(top);
        else if (top < 8) st[++top] = 0;
    }
}

int main()
{
    nrImpar = 2000000000;
    Citire();
    NrDivizori();
    Back();
    cout << nrImpar << "\n";
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2247 NrDiv

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2247 NrDiv de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!