Cod sursa(job #432308)

Utilizator DraStiKDragos Oprica DraStiK Data 2 aprilie 2010 09:16:38
Problema Suma si numarul divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <algorithm>
#include <vector>
#include <bitset>
using namespace std;

#define pb push_back
#define DIM 1000005
#define MOD 9973

vector <int> prim;
bitset <DIM> viz;
long long n;
int t,nd,sd;

void init ()
{
    int i,j;

    for (i=2; i<DIM; ++i)
        if (!viz[i])
        {
            prim.pb (i);
            for (j=i+i; j<DIM; j+=i)
                viz[j]=1;
        }
}

inline int lgput (int n,int p)
{
    int rez;

    for (rez=1; p; p>>=1)
    {
        if (p&1)
            rez=(rez*n)%MOD;
        n=(n*n)%MOD;
    }

    return rez;
}

void solve ()
{
    long long p;
    int d,e;

    nd=sd=1;
    for (d=0; 1LL*prim[d]*prim[d]<=n; ++d)
        if (n%prim[d]==0)
        {
            for (e=0, p=1; n%prim[d]==0; n/=prim[d])
                ++e;
            nd=(nd*(e+1))%MOD;
            sd=((1LL*sd*(lgput (prim[d],e+1)+MOD-1))%MOD*lgput (prim[d]-1,MOD-2))%MOD;
        }
    if (n>1)
    {
        nd=(2*nd)%MOD;
        sd=((1LL*sd*(lgput (n,2)+MOD-1))%MOD*lgput (n-1,MOD-2))%MOD;
    }
    printf ("%d %d\n",nd,sd);
}

int main ()
{
    freopen ("ssnd.in","r",stdin);
    freopen ("ssnd.out","w",stdout);
    int i;

    init ();
    scanf ("%d",&t);
    for (i=1; i<=t; ++i)
    {
        scanf ("%lld",&n);
        solve ();
    }

    return 0;
}