Cod sursa(job #1907284)

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

}

int sumOfDivs(long long p, int e)
{
    int pe = 1;
    for (int ij = 1; ij<= e+1 ; ij++)
    {
       pe *= p;
    }
    return (pe - 1) / (p - 1);
}

void desc(long long x, int &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; int e = 0;
    while( x!=1 )
    {
        e = 0;
        while(x % p == 0)
        {
            e++;
            x /= p;
        }

        if( e>0)
        {
            nrDiv *= e+1;
            sumDiv *= sumOfDivs(p , e);
            sumDiv %= 9973;
        }
        p++;
    }
    }

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

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

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

    return 0;
}