Cod sursa(job #1398334)

Utilizator andreib98Borza Andrei andreib98 Data 24 martie 2015 09:40:10
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
long int n,i;
const int MOD=9973;
long long int x;
struct punct
{
    int p,x;
};
punct a[1001];
int pow(int x,int p)
{
    long long int i,sol=1,a=x;
    for(i=0;(1<<i)<=p;++i)
    {
        if(((1<<i)&p)>0) sol=(sol*a)%MOD;
        a=(a*a)%MOD;
    }
    return sol;
};
int solve(int x)
{
    int p,k=1,i;
    long long int aux,d,s=1,c,y;
    for(i=1;i<=x;i++)
    {
        a[i].p=0;
        a[i].x=0;
    }
    aux=x;
    d=2;
    if(aux%2==0)
    {
        p=0;
        while(aux%2==0)
        {
            p++;
            aux/=2;
        }
        a[k].p=p;
        a[k].x=2;
        k++;
    }
    d++;
    while(aux!=1)
    {
        if(aux%d==0)
        {
            p=0;
            while(aux%d==0)
            {
                p++;
                aux/=d;
            }
            a[k].p=p;
            a[k].x=d;
            k++;
        }
        d=d+2;
    }
    p=1;
    for(i=1;i<=k;i++)
        {
            s=s*(a[i].p+1);
            y=pow(a[i].x,a[i].p+1)-1;
            p=p*(y/(a[i].x-1));
        }
    fout<<s<<" "<<p<<"\n";
};
int main()
{
fin>>n;
for(i=1;i<=n;i++)
{
    fin>>x;
    solve(x);
}
    return 0;
}