Cod sursa(job #1981886)

Utilizator trifangrobertRobert Trifan trifangrobert Data 17 mai 2017 09:22:41
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <cmath>

using namespace std;

ifstream f("ssnd.in");
ofstream g("ssnd.out");
int t;
long long n,s,card;

//bool ciur[1000001];

/*void Ciur()
{
    ciur[0] = ciur[1] = true;
    int k;
    for(int i=2;i<=1000001;i++)
        if (ciur[i] == false)
        {
            k = 2;
            while (k*i <= 1000001)
            {
                ciur[k*i] = true;
                k++;
            }
        }
}*/

long long lgput(long long base, long long exp)
{
    long long rez = 1;
    while (exp)
    {
        if (exp % 2)
        {
            rez *= base;
            exp--;
        }
        base *= base;
        exp /= 2;
    }
    return rez;
}

void ssnd(long long n)
{
    card=s=1;
    long long d=0,p;
    while(n%2==0)
    {
        n/=2;
        d++;
    }
    if(d)
    {
        card=d+1;
        s=lgput(2,d+1)-1;
    }
    long long r=sqrt(n);
    for(p=3;p<=r;p+=2)
    {
        d=0;
        while(n%p==0)
        {
            n/=p;
            d++;
        }
        if(d)
        {
            card*=d+1;
            s*=(lgput(p,d+1)-1)/(p-1);
            r=sqrt(n);
        }
    }
    if(n!=1)
    {
        card*=2;
        s*=(lgput(n,2)-1)/(n-1);
    }
    g<<card<<" "<<s%9973<<"\n";
}

int main()
{
    f >> t;
    for (int i = 1;i <= t;i++)
    {
        f >> n;
        ssnd(n);
    }
    return 0;
}