Cod sursa(job #625624)

Utilizator crazzytudTudor Popa crazzytud Data 25 octombrie 2011 08:34:36
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<stdio.h>

const int Z = 9973;
const int C = 1000000;

int ci[C+2],v[C];
int inv[Z+2];
int nr,s;

int u;
inline int minus(int a,int b)
{
    if(a-b>=0) return a-b;
    return Z+a-b;
}

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

    x=y1;
    y=x1-q*y1;
}

void ciur()
{
    int i,j;
    ci[1]=true;
    for(i=2;i*i<C;i++)
        if(!ci[i])
            for(j=i*i;j<C;j+=i)
               ci[j]=true;
    for(i=1;i<C;i++)
        if(!ci[i])
            v[++u]=i;

}


void desc(int n)
{
    nr=s=1;
    int i,p,ct;
    for(i=1;v[i]*v[i]<=n;i++)
    {
        if(n%v[i]!=0)
            continue;
        p=v[i];
        ct=1;

        while(n%v[i]==0)
        {
            ct++;
            p*=v[i];
            n/=v[i];
        }

        nr*=ct;
        s=(s*minus(p,1)%Z*inv[minus(v[i],1)])%Z;

    }
    if(n!=1)
    {
        nr*=2;
        s=s*(n+1)%Z;
    }
}


int main()
{
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    int i,x,y,d,t,n;
    for(i=1;i<Z;i++)
    {
        euclid(i,Z,x,y,d);
        inv[i]=minus(x,0);

    }

    ciur();
    scanf("%d",&t);
    for(i=1;i<=t;i++)
    {
        //s=1;
        scanf("%d",&n);
        desc(n);
        printf("%d %d\n",nr,s);
    }

    return 0;
}