Cod sursa(job #1160762)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 30 martie 2014 19:28:42
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#define MOD 9973
#include <bitset>

using namespace std;

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

int t, nq, nr[100000], sum, part, calc;
bool prim[1000050];

void ciur()
{
    nr[nq++] = 2;
    for(int d=3; d<=1000; d+=2)
        if(prim[d]==0)
            for(long long i=d*d; i<=1000050; i+=2*d)
                prim[i] = 1;
    for(int d=3; d<1000050; d+=2)
        if(prim[d]==0)
            nr[nq++] = d;
}

int putere(int x, int y)
{
    int n=x;
    int rez=1;
    for(int i=0; 1<<i<=y; i++){
        if((1<<i) & y){
            rez*=n;
        }
        n = n*n;
    }
    return rez;
}

void diviz(long long a)
{
    sum=1;
    int nrd=1, d, e;
    long long var;
    for(int i=0; i<nq && nr[i]*nr[i]<=a; i++){
        d = calc = nr[i];
        e = 0; part = 1;
        while(a%d==0){
            a/=d;
            e++;
            part=(part+calc);
            calc = (calc*(d%MOD))%MOD;
        }
        if(e){
            nrd *= (e+1);
            sum = (sum*(part%MOD))%MOD;
        }
    }
    if(a>1){
        nrd *= 2;
        sum = (sum*((a+1)%MOD))%MOD;
    }
    //cerr << suma << "\n";
    //printf("%d %d\n", nrd, sum);
    fout << nrd << " " << sum << "\n";
}

int main()
{
   // freopen("ssnd.in", "r", stdin);
    //freopen("ssnd.out", "w", stdout);


    //scanf("%d", &t);
    fin >> t;
    ciur();
    long long a=0;
    for(int i=0; i<t; i++){
        fin >> a;
        diviz(1ll*a);
    }
    return 0;
}