Cod sursa(job #1984980)

Utilizator raulmuresanRaul Muresan raulmuresan Data 26 mai 2017 17:23:55
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.24 kb
#include<fstream>
#include<vector>
#include<string>
#define modo 9973

using namespace std;

ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

const int NMAX = 1000005;

string sir;
int i, k, j,contor,st,dr,sol,y,t;
long long int n;
int ciur[NMAX];
vector <int> primes;

long long power(long long int baza, long long int exponent)
{
    long long x;
    if(exponent == 0) return 1;
    else
    {
        if(exponent % 2 == 1)
        {
            x = power(baza ,exponent / 2);
            return ((x*x)%modo*baza)%modo;
        }
        else
        {
            x = power(baza, exponent/2);
            return (x*x)%modo;
        }
    }
}




void solve(long long x)
{
    int nrDivizori = 1;
    int sumaDivizori = 1;
    //fout << x <<"\n";
    for(int i = 0; i < primes.size() && primes[i] <= x; i++)
    {
        if(x % primes[i] == 0)
        {
            //fout << primes[i] <<" ";
            long long aux = x;
            int nr = 0;
            while(aux != 1 && aux % primes[i] == 0)
            {
                aux = aux / primes[i];
                nr++;
            }
            //fout << primes[i] << " " << nr << "\n";
            nrDivizori = nrDivizori * (nr + 1);
            aux = 0;
            int numarator = (power(primes[i], nr + 1) - 1 + modo) % modo;
            //fout <<numarator<<"---\n";
            int numitor = power(primes[i] - 1, modo - 2);
            aux = (1LL * numarator * numitor) % modo;

            sumaDivizori = (sumaDivizori * aux) % modo;

        }

    }
    fout << nrDivizori << " " << sumaDivizori<< "\n";
}

void init()
{
    int N = 1000000;
    int i;
    for(i = 4; i <= N; i = i + 2)
    {
        ciur[i] = 1;
    }
    primes.push_back(2);
    for(i = 3; i <= N; i = i + 2)
    {
        //fout << i <<"\n";
        if(ciur[i] == 0)
        {
            //fout << i <<"\n";
            primes.push_back(i);
            for(long long j = 1LL*i * i ; j <= N; j = j + i)
            {
                //fout << j <<"\n";
                ciur[j] = 1;
            }
        }


    }
}

int main()
{
    init();
    fin >> t;
    for(i = 1; i <= t; i++)
    {
        fin >> n;
        solve(n);


    }

}