Cod sursa(job #775637)

Utilizator igsifvevc avb igsi Data 8 august 2012 17:00:36
Problema Suma si numarul divizorilor Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.72 kb
#include <stdio.h>

const int mod = 9973;
int primes[78499];
char isnp[500009];
long long n[1000];
int rez[1000][2];

void sieve();
int power(int x, int p);

int main()
{
    int j, i, t, p, nd, sd, aux1, aux2;
    long long n;
    FILE *in = fopen("ssnd.in", "r");
    FILE *out = fopen("ssnd.out", "w");

    sieve();

    for (fscanf (in, "%d", &t); t; --t)
    {
        fscanf (in, "%lld", &n);
        nd = 1; sd = 1;
        for (i = 1; n > 1 && 1LL * primes[i] * primes[i] <= n; ++i)
        {
            for (p = 0; n % primes[i] == 0; ++p, n /= primes[i]) ;

            if (p)
            {
                nd *= (p + 1);
                aux1 = power(primes[i], p+1) - 1;
                aux2 = power(primes[i]-1, mod-2);
                sd *= (aux1 * aux2)%mod;
                sd %= mod;
            }
        }
        if (n > 1) // n este prim
        {
            nd *= 2;
            sd *= (n+1)%mod;
            sd %= mod;
        }
        fprintf (out, "%d %d\n", nd, sd);
    }

    fclose(in);
    fclose(out);
    return 0;
}

int power (int x, int p) {
    int i, r;
    x %= mod;
    for (i = 1, r = 1; i <= p; i <<= 1)
    {
        if (i & p)
        {
            r *= x;
            r %= mod;
        }
        x *= x;
        x %= mod;
    }
    return r;
}

void sieve () {
    int i, j;
    primes[0] = 1;
    primes[1] = 2;

    for (i = 1; i <= 499; ++i)
        if (!isnp[i])
        {
            primes[++primes[0]] = (i << 1) + 1;
            for (j = (i*i + i) << 1; j <= 499999; j += (i << 1) + 1)
                isnp[j] = 1;
        }
    for ( i = 500; i <= 499999; ++i)
        if (!isnp[i]) primes[++primes[0]] = (i << 1) + 1;
}