Cod sursa(job #1545271)

Utilizator Silviu.Stancioiu@gmail.comSilviu Stancioiu [email protected] Data 6 decembrie 2015 16:38:24
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
#include <stdio.h>
#include <math.h>

#define lung 1000001

struct Res
{
    unsigned long long nr;
    unsigned long long sum;
};

FILE* fin;
FILE* fout;

unsigned long long* divizori;
int* puteri;
int* sol;

Res result;

void load()
{
    fin = fopen("ssnd.in","r");
    fout = fopen("ssnd.out","w");
}

int readT()
{
    int t;

    fscanf(fin,"%d",&t);

    return t;
}

int init()
{
    load();
    return readT();
}

void write(Res res)
{
    fprintf(fout,"%llu %llu\n",res.nr,res.sum);
}

int getPuteri(unsigned long long n)
{
    int rad ;

    rad = sqrtl(n);

    divizori = new unsigned long long[rad + 1];

    puteri = new int[rad+1];
    sol = new int[rad+1];

    int d = 2;

    int p;

    int index = 0;

    while(n!=1)
    {
        p = 0;

        while(n%d == 0)
        {
            n /= d;
            p++;
        }

        if(p!=0)
        {
            divizori[index] = d;
            puteri[index] = p;

            index++;

        }

        d++;
    }

    return index;
}

void freeData()
{
    delete[] divizori;
    delete[] puteri;
    delete[] sol;

    divizori = 0;
    puteri = 0;
    sol = 0;
}

unsigned long long sum(int n)
{
    int sum;

    sum = 1;

    for(int i=0;i<n;i++)
    {
        sum*=powl(divizori[i],sol[i]);
    }

    return sum;
}

void Backtr(int i,int n)
{
    if(i == n)
    {
        result.nr++;
        result.sum +=sum(n);
    }
    else
    {
        for(int j = 0 ; j<= puteri[i];j++)
        {
            sol[i] = j;
            Backtr(i+1,n);
        }
    }
}

void ssnd(int t)
{
    unsigned long long nr;

    for(int k=0;k<t;k++)
    {
        fscanf(fin,"%llu",&nr);

        result.nr = 0;
        result.sum = 0;

        Backtr(0,getPuteri(nr));

        write(result);

        freeData();
    }
}

void CloseFiles()
{
    fclose(fin);
    fclose(fout);
}

void Terminate()
{
    CloseFiles();

   freeData();
}

int main()
{
    ssnd(init());
    Terminate();
    return 0;
}