Cod sursa(job #966146)

Utilizator Vladinho97Iordan Vlad Vladinho97 Data 25 iunie 2013 13:51:30
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#include <cmath>
using namespace std;
bool a[1000000];
int p[100000],nr=1,f[50],e[50],cur=0;
void ciur()
{
    int i,j;
    p[1]=2;
    for(i=3;i<=1000000;i+=2)
    {
        if(a[i]==false)
        {
            nr++;
            p[nr]=i;
            if(i<1000)
                for(j=i*i;j<=1000000;j=j+2*i)
                    a[j]=true;
        }
    }
}
void descompunere(long long n)
{
    long long lim=sqrt((double)n),i=1,x=n;
    cur=0;
    while(p[i]<=lim&&x>1&&i<=nr)
    {
        if(x%p[i]==0)
        {
            cur++;
            f[cur]=p[i];
            e[cur]=0;
        }
        while(x%p[i]==0)
        {
            x=x/p[i];
            e[cur]++;
        }
        i++;
    }
    if(x>1)
    {
        cur++;
        f[cur]=x;
        e[cur]=1;
    }

}
long long nr_div()
{
    long long  i,pr=1;
    for(i=1;i<=cur;i++)
    {
        pr=(pr*(e[i]+1))%9973;
    }
    return pr;
}
long long s_div()
{
    long long i,pr=1,s,j;
    for(i=1;i<=cur;i++)
    {
        s=1;
        for(j=1;j<=e[i]+1;j++)
            s=s*f[i];
        s=s-1;
        s=s/(f[i]-1);
        pr=(pr*s)%9973;
    }
    return pr;
}
int main()
{
    ciur();
    int t,i,j;
    long long n;
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    scanf("%d",&t);
    for(j=1;j<=t;j++)
    {
        scanf("%lld",&n);
        descompunere(n);
        printf("%lld %lld\n",nr_div(),s_div());
    }
    return 0;
}