Cod sursa(job #1544564)

Utilizator Silviu.Stancioiu@gmail.comSilviu Stancioiu [email protected] Data 6 decembrie 2015 13:29:57
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.3 kb
#include <stdio.h>
#include <math.h>

#define lung 1000001

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

FILE* fin;
FILE* fout;

bool* composite;

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

int readT()
{
    int t;

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

    return t;
}

void initComposite()
{
    composite= new bool[lung];

    for(int i=0;i<lung;i++)
    {
        composite[i]= false;
    }

    composite[1] = true;
    composite[0] = true;
}

void genComposite()
{
    int t;

    int rad;

    rad = sqrtl(lung);

    for(unsigned long long i=2;i<rad;i++)
    {
        if(!composite[i])
        {
            t = i * i;

            for(unsigned long long j=t;j<lung;j+=i)
            {
                composite[j] = true;
            }
        }
    }
}

int init()
{
    initComposite();
    genComposite();

    load();
    return readT();
}

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

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

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

        res.nr = 0;
        res.sum = 0;

        int rad;

        rad = sqrtl(nr);

        for(unsigned long long i=2;i<rad;i++)
        {
            if(!composite[i])
            {
                for(unsigned long long j = i;j<nr;j+=i)
                {
                    if(nr % j == 0)
                    {
                        bool b = true;

                        for(int l = i-1 ; l>=2;l --)
                        {
                            if(j % l == 0)
                            {
                                b = false;
                            }
                        }

                        if(b)
                        {
                            res.nr ++;
                            res.sum+= j;
                        }
                    }
                }
            }

        }

        res.nr+=2;
        res.sum+=nr+1;

        write(res);
    }
}

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

void Terminate()
{
    CloseFiles();

    delete[] composite;
}

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