Cod sursa(job #1560967)

Utilizator TiberiuGCopaciu Tiberiu George TiberiuG Data 3 ianuarie 2016 15:41:31
Problema Suma si numarul divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
# include <cstdio>
# define N 1000010
# define P 100001
# define MOD 9973

using namespace std;

bool prim[N];
int ciur[P];
int n,x,putere,suma_divizorilor,numarul_divizorilor;

inline int pow(int a, int b)
{
    int p=1;
    while(b)
    {
        if(b%2==0) b/=2, a*=a;
        else p*=a,b--;
    }
    return p;
}

void Ciur()
{
    for(int i=2; i<N; ++i)
        prim[i]=true;
    for(int i=2; i<N; ++i)
        if(prim[i]==true)
        {
            ciur[++ciur[0]]=i;
            for(int j=i; j<N; j+=i)
                prim[j]=false;
        }
}

int main()
{
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);

    scanf("%d\n", &n);
    Ciur();

    for(int i=1; i<=n; ++i)
    {
        scanf("%d\n", &x);

        suma_divizorilor=1;
        numarul_divizorilor=1;

        for(int j=1; j<=ciur[0] && ciur[j]*ciur[j]<=x; ++j)
            if(x%ciur[j]==0)
            {
                putere=0;
                while(x%ciur[j]==0)
                {
                    putere++;
                    x/=ciur[j];
                }
                numarul_divizorilor*=(putere+1);
                suma_divizorilor*=(pow(ciur[j],putere+1)-1);
                suma_divizorilor/=(ciur[j]-1);
                suma_divizorilor%=MOD;

                if(x==1) break;
            }
        if(x!=1)
        {
            numarul_divizorilor*=2;
            suma_divizorilor*=(x*x-1);
            suma_divizorilor/=(x-1);
            suma_divizorilor%=MOD;
        }

        printf("%d %d\n", numarul_divizorilor, suma_divizorilor);
    }
}