Cod sursa(job #2430653)

Utilizator mariasmmskklns mariasmm Data 15 iunie 2019 18:14:59
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int nMax= 250000;
bool prim[nMax];
void ciur (unsigned int n)
{
    for (unsigned int d=3; d*d<=n; d+=2)
        for (unsigned int j=3; d*j<=n; j+=2)
                prim[d*j/2]=true;
}
int putere(int i, int j)
{
    int pi=1;
    j++;
    while (j--)
        pi*=i;
    return pi-1;
}
int main()
{
    ifstream f("ssnd.in");
    ofstream g("ssnd.out");
    unsigned int t,p;
    f>>t;
    vector <unsigned int> v;
    unsigned int maxi=0;
    for (unsigned int i=0; i<t; i++)
    {
        f>>p;
        v.push_back(p);
        if (p>maxi)
            maxi=p;
    }
    ciur(maxi);
    for (unsigned int i=0; i<t; i++)
    {
        int div[nMax]={0}, divi=1, nr;
        nr=v[i]; p=1;
        unsigned int s=0;
        while (nr%2==0)
        {
            div[0]++;
            nr/=2;
        }
        if (div[0]!=0)
        {
            p*=(div[0]+1);
            s=s+putere(2,div[0]);
        }
        while (nr!=1)
        {
            if (!prim[divi])
            {
                if (nr%(divi*2+1)==0)
                {
                    div[divi]++;
                    nr/=(divi*2+1);
                    if (nr%(divi*2+1)!=0)
                    {
                        p*=(div[divi]+1);
                        s*=(putere(divi*2+1,div[divi])/(divi*2));
                    }
                } else
                {
                divi++;
                }
            } else
            divi++;
        }
        g<<p<<" "<<s;
        g<<"\n";
    }
    return 0;
}