Cod sursa(job #624047)

Utilizator gramatovici_paulGramatovici Paul gramatovici_paul Data 21 octombrie 2011 16:27:52
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <cstdio>
using namespace std;



bool v[1000001];

int p[80000],inv[10000];

long long nr,s;

inline int mod(int x)
{
    int a=x%9973;
    if(a<0)
        return 9973+a;
    else
        return a;
}


void euclidext(int a, int b, int &x, int &y)
{
    if (b==0)
    {
        x=1;
        y=0;
        return;
    }
    int x1,y1,q=a/b;
    euclidext(b,a%b,x1,y1);
    x=y1;
    y=x1-y1*q;
}


void invers(int i)
{
    int x,y;
    euclidext(i,9973,x,y);
    inv[i]=mod(x);
}

void functie()
{
    for(int i=1;i<=9972;++i)
    {
        invers(i);
    }
}

void ciur()
{
    long long i,j;
    for(i=2;i<=1000000;++i)
    {
        if(v[i]==true)
            continue;
        p[++p[0]]=i;
        for(j=i;j*i<=1000000;++j)
        {
            v[i*j]=true;
        }
    }
}


void descompune(long long x)
{
    long long i,put;
    nr=1;
    s=1;
    for(i=1;p[i]*p[i]<=x;++i)
    {
        long long a;
        if(x%p[i]==0)
        {
            a=p[i]*p[i];
            put=1;
            x/=p[i];
            while(x%p[i]==0)
            {
                x/=p[i];
                put++;
                a=(a*p[i])%9973;
            }
            nr*=put+1;
            s=((s*(a-1))%9973*inv[(p[i]-1)%9973])%9973;
        }
    }
    if(x!=1)
    {
        nr*=2;
        s=(s*(x*x-1)/(x-1))%9973;
    }
}



int main()
{
    long long n,x,i;
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    scanf("%lld",&n);
    ciur();
    functie();
    for(i=1;i<=n;++i)
    {
        scanf("%lld",&x);
        descompune(x);
        printf("%lld %lld\n",nr,s);
    }
    return 0;
}