Cod sursa(job #1385813)

Utilizator rogoz.bogdanRogoz Bogdan rogoz.bogdan Data 12 martie 2015 13:46:07
Problema Suma si numarul divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <vector>
#include <cmath>
#define MX 1000001
#define MOD 9973
using namespace std;

ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
int t, p[MX];
long long n;
vector<int> f;

void Prime()
{
    int d,j;
    for(d=2; d<=MX/2; d++)
    {
        if(!p[d])
        {
            f.push_back(d);
            for(j=2*d; j<=MX; j+=d)
            {
                p[j] = 1;
            }
        }
    }
}

inline long long putere(int b, int a)
{
    int rez=1;
    while(b)
    {
        if(b%2)
        {
            rez *= a;
        }

        b /= 2;
        a *= a;
    }

    return rez;
}

int main()
{
    Prime();

    int i,act=0;
    long long suma, divizori;
    vector<int>::iterator it;
    fin>>t;

    for(i=1; i<=t; i++)
    {
        fin>>n;
        it = f.begin();
        suma = divizori = 1;
        while(n > 1)
        {
            act = 0;
            while(n%(*it) == 0)
            {
                n /= (*it);
                act++;
            }

            divizori *= (act+1);
            //fout<<act+1<<' '<<*it<<' '<<putere(act+1, *it)<<'\n';
            suma = ( suma * ( putere(act+1, *it) - 1) / (*it - 1) ) % MOD;
            //fout<<suma<<' ';
            it++;
        }

        fout<<divizori<<' '<<suma<<'\n';
    }

    f.clear();

    fin.close(); fout.close();
    return 0;
}