Cod sursa(job #1907830)

Utilizator razviii237Uzum Razvan razviii237 Data 6 martie 2017 21:09:05
Problema Suma si numarul divizorilor Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <cstdio>
using namespace std;
FILE *f, *g;
const long long vmax  = 1000001;
bool c[1000010];
long long t, nDiv;
long long n, sDiv;
long long ce[1000010], op;
void ciur()
{
    //Eratostene
    c[1] = true;
    ce[++op] = 2;
    for (long long ij =3;ij<=vmax;ij+=2)
    {
        if(c[ij] == false)
        {
            ce[ ++op ] = ij ;
            for(long long j= ij + ij +ij;j<=vmax;j += ij << 1)
            {
                c[j] = true;
            }
        }
    }

}

void desc(long long x, long long &nrDiv, long long &sumDiv)
{
    nrDiv = 1, sumDiv = 1;
    bool ok = true;
    if(x <= 1000000){
            if(c[x] == true)
        {nrDiv = 2;
        sumDiv = x + 1;
        if(x == 1)
        {
            nrDiv--;
            sumDiv--;
        }
        ok =false;
        }
    }

    if(ok == true)
    {long long p = 2; long long e = 0;


    for(p = 1; p<=op && x!=1; p++)
    {
        e = 0;
        long long psum = ce[p];
        while(x % ce[p] == 0)
        {
            e++;
            x /= ce[p];
            psum *= ce[p];
        }

        if( e>0)
        {
            nrDiv *= e+1;
            sumDiv = (sumDiv*((psum - 1)/(ce[p]-1)))%9973;

        }
    }



    }
}
int main()
{
    f = fopen("ssnd.in" , "r");
    g = fopen("ssnd.out" , "w");

    ciur();
    fscanf (f , "%lld", &t);

    for(long long i = 1; i <= t; i ++)
    {
        fscanf(f , "%lld", &n);
        desc(n , nDiv, sDiv);
        fprintf(g, "%lld %lld\n", nDiv, sDiv);
    }

    return 0;
}