Cod sursa(job #1526538)

Utilizator andru47Stefanescu Andru andru47 Data 16 noiembrie 2015 20:39:14
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>
#define NMAX 1000005
#define MOD 9973
using namespace std;
long long N,sumadiv,nrdiv,prime,v[500009],x;
bool ok[1000005];
void ciur()
{
    int i,j;
    for (i=2; i<=NMAX ; ++i)ok[i]=true;
    for (i=2; i<=NMAX ; ++i)
    {
        if (ok[i])
        {
            v[++prime]=i;
            j=i*2;
            for ( ; j<=NMAX ; j+=i)
                ok[j]=false;
        }
    }
}
long long powa(int nur,int putere)
{
    long long nr=1LL;
    for ( ; putere ; --putere)
        nr*=1LL*nur;
    return nr;
}
void descompunere(int nr)
{
    long long i=1,exp,p;
    bool ok=false;
    nrdiv=1LL;
    sumadiv=1LL;
    int xx=sqrt(1.0*nr);
    while (nr!=1&&i<=prime&&v[i]<=xx)
    {
        exp=0;
        p=v[i];
        while(nr%p==0&&nr>1)
        {
            nr/=p;
            ++exp;
        }
        ++i;
        if (exp==0)continue ;
        ok=true;
        nrdiv*=1LL*(exp+1);
        int y = 1LL*(powa(p,exp+1)-1)/(p-1);
        sumadiv=(sumadiv*y);
    }
    if (ok==true&&v[i]*v[i]>nr&&nr>1)nrdiv*=2,sumadiv*=((powa(nr,2)-1)/(nr-1));
    sumadiv%=MOD;
    if (ok=false)nrdiv=2,sumadiv=(nr+1)%MOD;
}
int main()
{
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    scanf("%lld\n",&N);
    ciur();
    for ( ; N ; --N)
    {
        scanf("%lld\n",&x);
        if (x<=NMAX&&ok[x]==true)
        {
            printf("2 %lld\n",(1+x)%MOD);
            continue;
        }
        descompunere(x);
        printf("%lld %lld\n",nrdiv,sumadiv);
    }
    return 0;
}