Cod sursa(job #1162261)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 31 martie 2014 18:55:32
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#define MOD 9973

using namespace std;

bool ciur[1000005];
int prim[100000],fact[100000],exp[100000],len;

inline void Ciur()
{
    int i,j;
    for(i=3;i<=1005;i+=2)
        if(!ciur[i])
            for(j=i*i;j<=1000000;j+=2*i)
                ciur[j]=true;
    prim[++prim[0]]=2;
    for(i=3;i<=1000000;i+=2)
        if(!ciur[i])
            prim[++prim[0]]=i;
}

inline long long Pow(int x, int p)
{
    long long put=1;
    while(p--)
        put*=x;
    return put;
}

inline void Solve(long long x)
{
    int k=0,i,sol;
    len=0;
    for(i=1;i<=prim[0] && x>1;++i)
    {
        k=0;
        while(x%prim[i]==0)
        {
            ++k;
            x/=prim[i];
        }
        if(k)
        {
            ++len;
            fact[len]=prim[i]; exp[len]=k;
        }
    }
    if(x>1)
    {
        ++len;
        fact[len]=x; exp[len]=1;
    }
    for(sol=i=1;i<=len;++i)
        sol=(sol*(exp[i]+1))%MOD;
    printf("%d ", sol);
    for(sol=i=1;i<=len;++i)
        sol=(1LL*sol*(Pow(fact[i],exp[i]+1)-1)/(fact[i]-1))%MOD;
    printf("%d\n", sol);
}

int main()
{
    int T;
    long long x;
    freopen ("ssnd.in","r",stdin);
    freopen ("ssnd.out","w",stdout);
    Ciur();
    scanf("%d", &T);
    while(T--)
    {
        scanf("%lld", &x);
        Solve(x);
    }
    return 0;
}