Cod sursa(job #1903409)

Utilizator PaulDurlaAndronie safafasafs PaulDurla Data 5 martie 2017 11:14:40
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <fstream>
#include <iostream>
#include <cstring>
#include <cmath>
#define MAX 100000 // cel mai mare nr prim posibil
#define MAXNRP 10000 // nr prime pana la MAX

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;
    for(int i=2,j=0;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;
    int j,exp,nrdiv,sumdiv;
    bool ok;
    for(int i=1;i<=t;i++)
    {
        fin>>n;
        exp=0;
        nrdiv=1;
        sumdiv=1;
        if(prim[n]==true)
        {
            nrdiv=2;
            sumdiv=1+n;
        }
        else
        {
            auxn=n;
            ok=false;
            for(j=1;auxn>=1 and ok==false;)
            {
                if(auxn%nrprime[j]==0)
                {
                    exp++;
                    auxn=auxn/nrprime[j];
                }
                else
                {
                    nrdiv=nrdiv*(exp+1);
                    sumdiv=sumdiv*((putere(nrprime[j],exp+1)-1)/(nrprime[j]-1));
                    exp=0;
                    j++;
                    if(nrprime[j]>sqrt(n))
                    {
                        ok=true;
                    }
                }
            }
            nrdiv=nrdiv*(exp+1);
            sumdiv=sumdiv*((putere(nrprime[j],exp+1)-1)/(nrprime[j]-1));
            exp=0;
        }
        fout<<nrdiv<<' '<<sumdiv%9973<<'\n';
    }
    return 0;
}