Cod sursa(job #1246156)

Utilizator thewildnathNathan Wildenberg thewildnath Data 20 octombrie 2014 18:02:03
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<stdio.h>
#include<math.h>
#include<bitset>

using namespace std;

#define NMAX 1000000
#define MOD 9973

int np, prime[78500];
bitset<NMAX+2> c;

void ciur()
{
    int pas;

    prime[++np]=2;

    for(int i=3; i<=NMAX; i+=2)
    {
        if(!c[i])
        {
            prime[++np]=i;

            if(i<=NMAX/i)
            {
                pas=2*i;

                for(int j=i*i; j<=NMAX; j+=pas)
                    c[j]=true;
            }
        }
    }
}

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

    int n, num, exp;
    long long x, sum, aux;

    ciur();

    scanf("%d", &n);
    for(int i=1; i<=n; ++i)
    {
        num=sum=1;

        scanf("%lld", &x);

        for(int j=1; prime[j]*prime[j]<=x && j<=np ;++j)
        {
            if(x%prime[j]==0)
            {
                exp=0;
                aux=prime[j];

                while(x%prime[j]==0)
                    x/=prime[j], ++exp, aux*=prime[j];

                num*=(exp+1);

                sum=((long long)sum*(aux-1ll)/(prime[j]-1))%MOD;
            }
        }

        if(x!=1)
        {
            num*=2;
            sum+=sum*x;
        }


        printf("%d %d\n", (num%MOD), (sum%MOD));
    }

    return 0;
}