Nu aveti permisiuni pentru a descarca fisierul grader_test35.in

Cod sursa(job #1360144)

Utilizator Liviu0010Oprescu Liviu Liviu0010 Data 25 februarie 2015 12:04:37
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 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) + 1;

    for(i = 2; i <= s; i++)
        if(!era[i])
            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, rad;
    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;
        rad = sqrt(nr) + 1;
        while(nr>1 && j < np && prime[j] <= rad)
        {
            d = 0;
            while(nr%prime[j] == 0 && nr && prime[j] <= rad)
            {
                nr /= prime[j];
                d++;
            }
            if(d)
            {
                nrdiv = nrdiv*(d+1)%MOD;

                if(d==1)
                    sdiv = sdiv*(prime[j]+1)%MOD;
                else
                    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();
}