Cod sursa(job #2216948)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 28 iunie 2018 14:22:04
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("ssnd.in");
ofstream g("ssnd.out");

const int MOD=9973;
const int val_max=1e6;

bool ciur[val_max+5];
int prime[val_max+5], cnt, d;
int i, j;
int t, aux;
long long x;
long long produs, nd, sum, p;

int main()
{
    //Ciurul lui Eratostene

    ciur[0]=ciur[1]=true;
    for(i=3; i*i<=1000001; i+=2)
        if(ciur[i]==false)
            for(j=2; j*i<=1000001; j++)
                ciur[i*j]=true;

    cnt++;
    prime[cnt]=2;

    for(i=3; i<=1000001; i+=2)
        if(ciur[i]==false)
            prime[++cnt]=i;
    //

    /*for(i=1; i<=cnt; i++)
        g<<prime[i]<<' ';*/

    f>>t;

    for(i=1; i<=t; i++)
    {
        f>>x;

        d=2;
        sum=1;
        nd=1;
        aux=1;

        while(d*d<=x && aux<=cnt)
        {
            if(x%d==0)
            {
                p=0;

                produs=1;

                while(x%d==0)
                {
                    p++;
                    x/=d;
                    produs*=d;
                }

                if(p)
                {
                    nd*=(p+1);
                    sum*=((produs*d-1)/(d-1));
                }
            }

            aux++;
            d=prime[aux];
        }

        if(x!=1)
        {
            nd*=2;
            sum*=((x*x-1)/(x-1));
        }

        g<<nd<<' '<<sum<<'\n';
    }
    return 0;
}