Cod sursa(job #1245644)

Utilizator thewildnathNathan Wildenberg thewildnath Data 19 octombrie 2014 19:31:08
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 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, lim;
    long long x, sum, aux, put;

    ciur();

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

        scanf("%lld", &x);

        lim=sqrt(x);

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

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

                num*=(exp+1);

                put=1ll;
                aux=0ll;
                for(int k=0; k<=exp; ++k, put*=(long long)prime[j])
                    aux+=sum*put;

                sum=aux;
            }
        }

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


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

    return 0;
}