Rezolvare completă PbInfo #2106 Armonica

Spunem că trei numere a b c sunt în progresie armonică dacă b este media armonică a numerelor a și c, adică
\( b = \frac{2}{\frac{1}{a} + \frac{1}{c}} = \frac{2 \cdot a \cdot c} {a + c} \)

Cerința

Cunoscând un număr natural b să se determine toate perechile de numere naturale (a,c) pentru care a b c sunt în progresie armonică.

Date de intrare

Fișierul de intrare armonica.in conține pe prima linie numărul b.

Date de ieșire

Fișierul de ieșire armonica.out va conține pe prima linie numărul n, reprezentând numărul de perechi de numere naturale (a,c) pentru care b este media armonică. Pe următoarele linii se vor afișa perechile de numere cerute. Astfel fiecare dintre următoarele n linii vor conține câte două numere a și c separate printr-un spațiu cu semnificația că b este medie armonică a numerelor a și c.

Restricții și precizări

  • 1 ≤ b ≤ 1 000 000 000;
  • Pentru teste în valoare de 40 de puncte avem b ≤ 1 000 000;
  • Perechile de numere din fișierul de ieșire pot fi afișate în orice ordine;
  • Dacă b este medie armonică între două numere diferite a și c atunci perechile (a,b) și (c,a) sunt considerate soluții distincte.
  • În concurs s-au acordat 10 puncte din oficiu. Pe site se acordă 10 puncte pentru exemplu.

Exemplu

armonica.in

3

armonica.out

3
3 3
2 6
6 2

Explicație

Numărul 3 este medie armonică a numerelor 3 și 3. Avem progresia armonică (3,3,3)
Numărul 3 este medie armonică a numerelor 2 și 6. Avem progresiile armonice (2,3,6) și (6,3,2).

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 Armonica:

#include <bits/stdc++.h>
#define tip long long
using namespace std;
ifstream f("armonica.in");
ofstream g("armonica.out");
tip b;
void factorizare(tip),bkt(tip,tip);
vector<pair<tip,tip>>F,sol;
vector<pair<int,int>> V;
int main()
{
    f>>b;
    if(b%2)
        factorizare(b);
    else
        factorizare(b/2);
    bkt(0,1);
    g<<sol.size()<<'\n';
    for(auto it:sol)
        g<<it.first<<' '<<it.second<<'\n';
    return 0;
}
void factorizare(tip k)
{
    for(tip i=2;i*i<=k;i++)
        if(k%i==0)
    {
        tip e=0;
        while(k%i==0)
        {
            e++;k/=i;
        }
        F.push_back({i,2*e});
    }
    if(k>1)
        F.push_back({k,2});
}
void bkt(tip p,tip d)
{
    if(p==F.size())
    {
        tip a,c,x;
        if(b%2)
        {
            x=b*b/d;
            a=(b+d)/2;
            c=(b+x)/2;
        }
        else
        {
            x=b*b/4/d;
            a=b/2+d;
            c=b/2+x;
        }
        //g<<d<<' '<<x<<'\n';
        sol.push_back({a,c});
        return;
    }
    tip i=F[p].first,j=F[p].second,m=1;
    for(tip q=0;q<=j;q++)
    {
        bkt(p+1,d*m);
        m*=i;
    }
}

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 #2106 Armonica

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2106 Armonica 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!