Cod sursa(job #2474522)

Utilizator ALEXANDRU127ANDRITA ALEXANDRU ALEXANDRU127 Data 15 octombrie 2019 13:46:43
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>
#include <fstream>

#define mod 9973
#define Nmax 100000

using namespace std;

int put(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;
        }
    }
    return rez;
}

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

void ciur()
{
    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;
        }

    }
}

void desc(int x,int &sd,int &nd)
{
    int p=0;
//    while(x%2==0)
//    {
//        x/=2;
//        p++;
//    }
    /*   if(p!=0)
       {
           pd*=(p+1);
           sd*=((put(2,p+1)-1))*(put(2-1,mod))%mod;
       }*/
    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=((put(pr[i],p+1)-1)/(pr[i]-1))*(put(pr[i]-1,mod-2))%mod;
        }
    }}
    if(x!=1)
    {
        nd*=2;
        sd*=(x+1);
    }
}

int main()
{

    ifstream fin("n.in");
    int n,t;
    ciur();
    fin>>t;
    for(int i=0; i<t; i++)
    {
        fin>>n;
        int sd=1;
        int nd=1;
        desc(n,sd,nd);
        cout<<nd<<" "<<sd<<"\n";
    }
    return 0;
}