Cod sursa(job #915198)

Utilizator ucnahHancu Andrei ucnah Data 14 martie 2013 20:03:07
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <cstdio>
#include <algorithm>
#include <cmath>
#define MAX 1000005
using namespace std;
int t,n,nr=1,nd,sd;
int prim[MAX];
bool viz[MAX];
long long MOD=9973;
void ciur()
{
    for(int i=2;i<MAX;i++)
    {
        if(viz[i]==0)
            prim[nr++]=i;
        for(int j=i+i;j<MAX;j+=i)
            viz[j]=1;
    }
}
long long pow(int n,long long p)
{
    if(p==0)
        return 1;
    long long rezultat=0;
    if(p%2==0)
    {
        rezultat=pow(n,p/2)%MOD;
        return (rezultat*rezultat)%MOD;
    }
    else
    {
        rezultat=pow(n,p-1)%MOD;
        return (n*rezultat)%MOD;
    }

}
int main()
{
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    scanf("%d",&t);
    ciur();
    for(int i=0;i<t;i++)
    {
        scanf("%d",&n);
        int aux=n;
        nd=1;
        sd=1;
        long long sus=1,jos=1;
        for(int i=1;i<=nr && prim[i]*prim[i]<=aux;i++)
        {
            long long y=0;
            while(n%prim[i]==0)
            {
                n/=prim[i];
                y++;
            }
            nd*=(y+1);
            sus=((pow(prim[i],y+1)-1)%MOD);
            jos=(pow(prim[i]-1,MOD-2)%MOD);
            sd=(((sd*sus)%MOD)*jos)%MOD;
        }
        if(n>1)
        {
            nd*=2;
            sd=(sd*(n+1))%MOD;
        }
        printf("%d %d\n",nd,sd);
    }
    return 0;

}