Cod sursa(job #2472042)

Utilizator ALEXANDRU127ANDRITA ALEXANDRU ALEXANDRU127 Data 11 octombrie 2019 22:39:17
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>

#define Nmax 100000
#define mod 9973

using namespace std;

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

int c[Nmax+5],pr[Nmax+1],k=0;

void ciurEratostene()
{
    for(int i=2;i<=Nmax;i++)
    {
        if(c[i]==0)
           pr[k++]=i;
           for(int j=i+i;j<=Nmax;j+=i)
            c[j]=1;
    }
}

int ridicarePutere(int b,int e)
{
    int rez=1;
    while(e)
    {
        if(e%2==1)
        {
            e--;
            rez=(rez*b)%mod;
        }
        else
        {
            e/=2;
            b=(b*b)%mod;
        }
    }
}

//sd si nd sunt suma si numarul de divizori

void descompunereSumaNumar(int x,int &sd,int &nd)
{
    int p=0;
    for(int i=0;i<k && pr[i]*pr[i]<=x;i++)
    {
        if(x%pr[i]==0)
        {
            p=0;
            while(x%pr[i]==0)
            {
                x/=pr[i];
                p++;
            }
            if(p!=0)
            {
                nd*=(p+1);
                sd=((ridicarePutere(pr[i],p+1)-1)/(pr[i]-1))*(ridicarePutere(pr[i]-1,mod-2))%mod;
            }
        }
    }
    if(x!=1)
    {
        nd*=2;
        sd*=(x+1);
    }
}

int main()
{
    int n,t;
    fin>>t;
    ciurEratostene();
    for(int i=1;i<=t;i++)
    {
        fin>>n;
        int nd=1,sd=1;
        descompunereSumaNumar(n,sd,nd);
        fout<<nd<<" "<<sd<<"\n";
    }
    return 0;
}