Cod sursa(job #1560972)

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

using namespace std;

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

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

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

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

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

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

        suma_divizorilor=1;
        numarul_divizorilor=1;

        for(long long 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("%lld %lld\n", numarul_divizorilor, suma_divizorilor);
    }
}