Cod sursa(job #2042059)

Utilizator dragomirmanuelDragomir Manuel dragomirmanuel Data 17 octombrie 2017 23:40:49
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <bits/stdc++.h>
#include <cstdio>

using namespace std;

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

const long long NMax = 1000005;
const long long mod = 9973;
char ciur[NMax];
int primes[NMax];
long long N;

pair < long, long > euclid_extins(long long x, long y)
{
    if(y==0)
    {
        return {1,0};
    }

    auto aux = euclid_extins(y,x%y);
    long long rap = x/y;
    return {aux.second, aux.first - rap * aux.second};
}

void Ciuruletz()
{

    for(long long i=3; i<=NMax; i+=2)
    {
        if(!ciur[i])
            {
            for(long long j=i; j*i<=NMax; j+=2)
                ciur[i*j] = 1;
            }
    }

    int k = 0;
    primes[++k] = 2;

    for(int i=3; i<=NMax; i+=2)
        if(ciur[i]==0)
            primes[++k] = i;
}

long long RidExp(long long nr, long long put)
{
    long long rez = 1;

    do
    {
        if(put & 1)
            rez = (nr*rez)%mod;

        nr = (nr*nr)%mod;
        put = put >> 1;
    }
    while(put);
    return rez;
}

void Solve(long long x)
{
    long long ind = 1;
    long long nr_div = 1;
    long long sum = 1;

    while(primes[ind] * primes[ind] <= x)
    {
        long long po = 0;
        while(x%primes[ind] == 0)
        {
            ++po;
            x/=primes[ind];
        }

        if(po)
        {
            nr_div *= 1LL * (po+1);

            long long pk = primes[ind];
            long long nom = (RidExp(1LL * pk, 1LL * po+1) - 1)%mod;
            long long nr = (1LL * euclid_extins(1LL * pk - 1,1LL * mod).first)%mod;

            sum = 1LL * (sum * nom) % mod;
            while(nr<0)
            {
                nr+= mod;
            }

            sum = 1LL * (sum * nr) % mod;
        }

        ++ind;
    }

    if(x!=1)
    {
        nr_div *= (1LL * 2)%mod;
        sum *= 1LL * (x+1) % mod;
    }

    fout << nr_div%mod << " " << sum% mod<< "\n";


}

void Read()
{
    long long t;
    fin >> t;
    for(long long i=1; i<=t; ++i)
    {
        long long x;
        fin >> x;
        Solve(x);
    }
}

int main()
{
    Ciuruletz();
    Read();
    return 0;
}