Cod sursa(job #799241)

Utilizator icb_mnStf Cic icb_mn Data 18 octombrie 2012 13:45:30
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include<fstream>
#define LL long long
#define M 9973
#define NMAX 1000009 // un numar are divizori pana la jumatatea lui => n = 10^12 =>d <= 10^6
using namespace std;

LL n, d[50], p[50];
int t, k,semn[NMAX], ciur[NMAX],lng = 0;

inline void eratosthenes()
{
    for(int i = 2; i <= NMAX; i+=2) semn[i] = 1;
    ciur[0] = 2;
    lng = 1;
    for(int i = 3; i <= NMAX; i += 2)
    {
        if(!semn[i])
        {
            ciur[lng] = i;
            lng++;
            for(int j = i; j <= NMAX; j += i)semn[j] = 1;
        }
    }
}

inline void descompune(LL n, LL d[], LL p[], int &k)
{
    LL x = 2;
    k = 0;
    int i = 0;

    while(n > 1)
    {
        if(!(n % ciur[i]))
        {
            k++;
            p[k] = ciur[i];
            d[k] = 0;
            while(!(n % ciur[i]))
            {
               d[k]++;
               n /= ciur[i];
            }
        }
        i++;
    }
}

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

    f>>t;
    eratosthenes();

    for(int r = 1; r <= t; ++r)
    {
        f>>n;
        LL nr;
        LL sum;

        descompune(n, d, p, k);

        nr = 1;
        sum = 1;
        LL putere;
        for(int i = 1; i <= k; ++i)
        {
            LL s = 1;
            nr =(nr *(d[i] + 1)) % M;
            putere = 1;
            for(int j = 1; j <= d[i]; ++j)
            {
                putere =putere * p[i];
                s += putere;
            }
            sum = (sum * s) % M;
        }
        g<<nr<<' '<<sum <<'\n';
    }

    g.close();

    return 0;
}