Cod sursa(job #1684554)

Utilizator KOzarmOvidiu Badea KOzarm Data 11 aprilie 2016 09:57:30
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>

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


int a[500000],i,k,w;
bool ok[1000005];
long long n;



void euclid(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1;
        y=0;
    }
    else
    {
        euclid(b,a%b,x,y);
        int aux=x;
        x=y;
        y=aux-a/b*y;
    }
}




int invers(int a,int b)
{
    int x=0;
    int y=0;
    euclid(a,b,x,y);
    while(x<0)
        x+=b;
    x=x%b;
    return x;
}





void ciur()
{
    for(int i=2;i<=1000000;i++)
    {
        if(ok[i]==0)
        {
            a[++w]=i;
            for(int j=i;j<=1000000/i;j++)
                ok[i*j]=1;
        }
    }
}





int putere(long long x,int p)
{
    if(p!=0)
    {
        if(p%2==0)
        {
            long long t=putere(x,p/2);
            return t*t%9973;
        }
        else
            return putere(x,p-1)*x%9973;
    }
    else
    return 1;
}





void divizori(long long n)
{
    long long t=1;
    long long sum=1;
    for(int i=1;a[i]<=n/a[i];i++)
    {
        int s=0;
        while(n%a[i]==0)
        {
            s++;
            n/=a[i];
        }
        if(s>0)
        {
        t=t*(s+1);
        sum=sum*(putere(a[i],s+1)-1)*invers(a[i]-1,9973)%9973;
        }
    }
    if(n!=1)
    {
        t*=2;
        sum=sum*(n*n-1)/(n-1)%9973;
    }
    fout<<t<<" "<<sum<<"\n";
}





int main()
{
    fin>>k;
    ciur();
    while(k)
    {
        k--;
        fin>>n;
        divizori(n);
    }
    return 0;
}