Cod sursa(job #2456985)

Utilizator AndreiCroitoruAndrei Croitoru AndreiCroitoru Data 16 septembrie 2019 10:02:38
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb

#include <bits/stdc++.h>

using namespace std;
ifstream in("ssnd.in");
ofstream out("ssnd.out");
bool ciur[1000001];
int prime[80001];
int nrp;
long long lgput(long long a,long long b)
{
    long long r=1;
    while(b>1)
    {
        if(b%2==1)
        {
            r*=a;
            b--;
        }
        else
        {
            a*=a;
            b/=2;
        }
    }
    return a*r;
}
void ciurr()
{
    int i,j;
    ciur[0]=ciur[1]=1;
    for(i=2;i*i<=1000000;i++)
        if(ciur[i]==0)
            for(j=i*i;j<=1000000;j+=i)
                ciur[j]=1;
    for(i=1;i<=1000000;i++)
        if(ciur[i]==0)
            prime[++nrp]=i;
}
void desc(long long n)
{
    long long nrd=1,sd=1,p,exp,i=1;
    while(prime[i]*prime[i]<=n)
    {
        p=prime[i];
        exp=0;
        if(n%p==0)
        {
            while(n%p==0)
                n/=p,exp++;
            nrd=nrd*(exp+1);
            sd=(sd*(lgput(p,exp+1)-1)/(p-1))%9973;
        }
        i++;
    }
    if(n!=1)
    {
        nrd=nrd*2;
        sd=(sd*(n*n-1)/(n-1))%9973;
    }
    out<<nrd<<" "<<sd%9973<<'\n';
}
int main()
{
    ciurr();
    long long n,i,nr;
    in>>n;
    for(i=1;i<=n;i++)
    {
        in>>nr;
        desc(nr);
    }
    return 0;
}