Cod sursa(job #788839)

Utilizator round2Test P round2 Data 15 septembrie 2012 22:51:29
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <cstdio>
#include <cassert>
#include <cstring>
#define Max 1000001
#define Mod 9973

int pr[80000],k;
long long n;

void ciur()
{
    bool p[Max];
    memset(p,0,sizeof(p));
    int i=2;
    while(i<=1000)
    {
        while(p[i])i++;
        for(int j=i*i;j<Max;j+=i)p[j]=1;
        i++;
    }
    for(int i=2;i<Max;i++)
    if(p[i]==0)pr[++k]=i;
}

void desc(long long x)
{
    long long s=1,p;
    int d,nr=1,i=1;
    while(i<=k && pr[i]*pr[i]<=n)
    {
        if(n%pr[i]==0)
        {
            d=0; p=pr[i];
            while(n%pr[i]==0)
            {
                p*=pr[i];
                d++;
                n/=pr[i];
            }
            nr*=(d+1);
            s=s*((p-1)/(pr[i]-1))%Mod;
        }
        i++;
    }
    if(n!=1)
    {
        nr*=2;
        s=s*((n*n-1)/(n-1))%Mod;
    }
    printf("%d %lld\n",nr,s);
}


int main()
{
    int t;
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    ciur();
        scanf("%d",&t);
        while(t--)
        {
            scanf("%lld",&n);
            desc(n);
        }
    return 0;
}