Cod sursa(job #1908125)

Utilizator PaulDurlaAndronie safafasafs PaulDurla Data 6 martie 2017 22:52:53
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#include <iostream>
#include <cstring>
#include <cmath>
#define MAX 1000005 // cel mai mare nr prim posibil
#define MAXNRP 10000
#define MOD 9973

using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
int putere(int n,int exp)
{
    int pwn=1;
    for(int i=1;i<=exp;i++)
    {
        pwn=pwn*n;
    }
    return pwn;
}
int main()
{
    int t;
    fin>>t;
    int  nrprime[MAXNRP];
    bool prim[MAX];
    memset(prim,true,sizeof(prim));
    memset(nrprime,0,sizeof(nrprime));
    prim[1]=false;
    prim[0]=false;
    int j=0;
    for(long long i=2;i<=MAX;i++)
    {
        if(prim[i]==true)
        {
            nrprime[++j]=i;
            //cout<<nrprime[j]<<'\n';
            for(int d=2;d*i<=MAX;d++)
            {
                prim[d*i]=false;
            }
        }
    }
    long long n,auxn,sumdiv;
    int exp,k,nrdiv;
    k=j--;
    for(int i=1;i<=t;i++)
    {
        fin>>n;
        exp=0;
        nrdiv=1;
        sumdiv=1;
        auxn=n;
        for(j=1;1LL*nrprime[j]*nrprime[j]<=auxn and i<=k;)
        {
            while(auxn%nrprime[j]==0)
            {
                exp++;
                auxn=auxn/nrprime[j];
            }
            nrdiv=nrdiv*(exp+1);
            sumdiv=sumdiv*((putere(nrprime[j],exp+1)-1)/(nrprime[j]-1))%MOD;
            exp=0;
            j++;
        }
        if(auxn>1)
        {
            nrdiv*=2;
            sumdiv=(1LL*sumdiv*(auxn+1)%MOD);
        }
        fout<<nrdiv<<' '<<sumdiv%MOD<<'\n';
    }
    return 0;
}