Cod sursa(job #1350809)

Utilizator Liviu0010Oprescu Liviu Liviu0010 Data 20 februarie 2015 22:58:10
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<fstream>
#include<cmath>
#include<bitset>
using namespace std;

#define N 1000001
#define MOD 9973

bitset<N> era;
unsigned int prime[N], np;


void ciurul()
{
    unsigned int i, j, s = sqrt(N);

    for(i = 2; i <= s; i++)
    {
        if(era[i])
            continue;
        for(j = i*i; j <= N; j += i)
            era[j] = 1;
    }

    for(i=2; i<= N; i++)
        if(!era[i])
            prime[np++] = i;
}

unsigned int _pow(unsigned int a, unsigned int b)
{
    char i;
    unsigned int rez = 1;

    for(i=0; ((unsigned int)1<<i) <= b; i++)
    {
        if((1<<i) & b)
            rez = (rez*(a%MOD))%MOD;
        a = (a*(a%MOD))%MOD;
    }

    return rez;
}

int main()
{
    unsigned long long t, i, j, nrdiv, sdiv, d, nr;
    fstream in("ssnd.in", fstream::in);
    fstream out("ssnd.out", fstream::out);

    ciurul();

    in>>t;

    for(i=0; i<t; i++)
    {
        nrdiv = 1;
        sdiv = 1;
        in >> nr;

        j = 0;

        while(nr>1)
        {
            d = 0;
            while(nr%prime[j] == 0 && nr)
            {
                nr /= prime[j];
                d++;
            }
            nrdiv *= (d+1);
            sdiv *= (((_pow(prime[j]%MOD, (d+1)%MOD)-1)%MOD)/((prime[j] - 1)%MOD))%MOD;
            j++;
        }
        out<<nrdiv<<" "<<sdiv<<'\n';
    }

    in.close();
    out.close();
}