Cod sursa(job #1350943)

Utilizator Liviu0010Oprescu Liviu Liviu0010 Data 21 februarie 2015 00:31:59
Problema Suma si numarul divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 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 long long a, unsigned long long b)
{
    char i;
    unsigned int rez = 1;

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

    return rez;
}

int main()
{
    unsigned long long t, i, j, nrdiv, sdiv, d, nr, cp;
    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;
        cp = nr;
        while(nr>1 && j < np)
        {
            d = 0;
            while(nr%prime[j] == 0 && nr)
            {
                nr /= prime[j];
                d++;
            }
            if(d)
            {
                nrdiv = nrdiv*(d+1)%MOD;
                sdiv = sdiv*(_pow(prime[j], d+1)-1)/(prime[j] - 1)%MOD;
            }

            j++;
        }
        if(nr == cp)
            out<<2<<' '<<(1+nr)<<'\n';
        else
            out<<nrdiv<<" "<<sdiv<<'\n';
    }
    in.close();
    out.close();
}