Cod sursa(job #1134400)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 6 martie 2014 15:05:00
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <cstdio>
#include <vector>
#define MOD 9973
using namespace std;

FILE * is = fopen("ssnd.in", "r");
FILE * os = fopen("ssnd.out", "w");

int n, x;
int div, sdiv;

void SOLVE();
int POW(int k, int q);

int main()
{
    fscanf(is, "%d", &n);
    while ( n-- )
    {
        fscanf(is, "%d", &x);
        SOLVE();
    }
    fclose(is);
    fclose(os);
    return 0;
}

void SOLVE()
{
    vector<int> p, d;
    int pt = 3;
    if ( x % 2 == 0 )
    {
        p.push_back(2);
        d.push_back(1);
        x /= 2;
        while ( x % 2 == 0 )
        {
            ++d[0];
            x /= 2;
        }
    }
    while ( x != 1 )
    {
        if ( x % pt == 0 )
        {
            p.push_back(pt);
            d.push_back(1);
            x /= pt;
            while ( x % pt == 0 )
            {
                ++d[d.size()];
                x /= pt;
            }
        }
        pt += 2;
    }
    //for ( size_t i = 0; i < p.size(); ++i )
        //fprintf(os, "%d %d\n", p[i], d[i]);
    div = 1;
    sdiv = 1;
    while(p.size())
    {
        div *= (d.back() + 1);
        sdiv = ( sdiv * ( ( POW(p.back(), d.back() + 1) - 1 ) % MOD ) ) % MOD;
        sdiv /= p.back() - 1;
        p.pop_back();
        d.pop_back();
    }
    fprintf(os, "%d %d\n", div, sdiv);
}

int POW(int k, int q)
{
    int r;
    if (q == 1)
        return k;
    r = ( POW(k, q / 2) % MOD);
    r = ( r * r ) % MOD;
    if ( q % 2 == 1 )
        r *= k;
    return r;
}