Cod sursa(job #1248671)

Utilizator deea101Andreea deea101 Data 25 octombrie 2014 19:23:36
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <iostream>
#include <cmath>
#define MOD 9973
#define NCIUR 1000000
using namespace std;

ifstream f("ssnd.in");
ofstream g("ssnd.out");

long long n;
int T, prim[200000], countP;
bool ciur[1000005];

void goCiur()
{
    int i,j;

    prim[++countP] = 2;

    for(i=3;i<=NCIUR;i+=2)
        if(!ciur[i])
        {
            prim[++countP]=i;

            if(i < 1010)
                for(j=i*i; j<=NCIUR; j+=2*i)
                    ciur[j] = true;

        }
}

int exp ( int x , int y )
{
    int rez=1;
    while(y)
    {
        if(y%2==0)
            x=(x*x)%MOD;
        else
        {
            rez=(rez*x)%MOD;
            x=(x*x)%MOD;
        }
        y/=2;
    }
    return rez;
}

int main()
{

    int i, nr, s, d, rad, prod, r1, r2;

    f>>T;
    goCiur();
    while(T--)
    {
        f>>n;

        nr=1, s=1;

        rad=int(sqrt(n))+1;
        for(i=1; i<=countP && prim[i]<=rad; i++)
        {
            if( n%prim[i] ) continue;

            d=0;
            while(n%prim[i]==0)
            {
                d++;
                n/=prim[i];
            }

            nr=nr*(d+1);

            s=(s * ( exp(prim[i],d+1) - 1 ))%MOD;
            s=(s * ( exp(prim[i]-1,MOD-2) ))%MOD;

        }

        if( n!=1 )
        {
            nr=nr*2;
            s=(s*(n+1))%MOD;
        }

        g<<nr<<' '<<s<<'\n';
    }

}