Cod sursa(job #432371)

Utilizator hasegandaniHasegan Daniel hasegandani Data 2 aprilie 2010 12:08:06
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include<stdio.h>

#define Nmax 1000005
#define mod 9973
#define plm long long

int A;

int e[Nmax],p[Nmax],k;
plm pr[Nmax],sum;
int nr[Nmax],cur,sol;

void ciur()
{
    for(plm i=2;i<Nmax;++i)
        if (!e[i])
            {
            for(plm j=i*i;j<Nmax;j+=i)
                e[j]=1;
            p[++k]=i;
            }
}

int pw(int A,int B)
{
    int rez,pwe=A;

    for(rez=1; B ; B/=2)
        {
        if (B%2==1)
            rez = (rez * pwe)%mod;
        pwe = (pwe * pwe)%mod;
        }
    return rez;
}

int gcd(int A,int B,int &X,int &Y)
{
    if (B==0)
        {
        X=1;
        Y=0;
        return A;
        }

    int X0,Y0,D;
    D = gcd(B,A%B,X0,Y0);

    X = Y0;
    Y = X0 - (A/B)*Y0;
    return D;
}

void solve()
{
    int b=A,M=0,D,X,Y;
    for(int i=1; b>1 && p[i]*p[i]<=b;++i)
        if (b%p[i]==0)
            {
            pr[++M]=p[i];
            nr[M]=0;
            for(;b%p[i]==0; b/=p[i] , ++nr[M]);
            }
    if (b>1)
        {
        pr[++M]=b;
        nr[M]=1;
        }
    sol=1;
    for(int i=1;i<=M;++i)
        sol *= (nr[i]+1);
    printf("%d ",sol);

    sum=1;X=0;Y=0;
    for(int i=1;i<=M;++i)
        {
        cur = pw(pr[i],nr[i]+1) - 1;
        D = gcd(pr[i]-1,mod,X,Y);
        while(X<0) X+=mod;
        sum = (sum*cur*X)% mod;
        }
    printf("%lld\n",sum);
}

int main()
{
    int T;
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    scanf("%d",&T);

    ciur();
    for(;T;--T)
        {
        scanf("%d",&A);
        solve();
        }
    return 0;
}