Cod sursa(job #996302)

Utilizator gbi250Gabriela Moldovan gbi250 Data 11 septembrie 2013 16:22:45
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <cstdio>
#define MOD 9973
#define SIZE 1000001

using namespace std;

int t, nr, k, exp, i, nr_div;
long long prime[500001], sum_div;
bool c[SIZE];

inline void erathostenes()
{
    for(int i=2; i<=SIZE; ++i)
        if(!c[i])
        {
            prime[++k]=i;
            for(int j=2*i; j<=SIZE; j+=i)
                c[j]=1;
        }
}

long long power(long long base, long long exp)
{
    if(exp == 0)
        return 1;
    else if(exp == 1)
        return base % MOD;
    else if( exp & 1 )
        return ( (base % MOD) * power((base%MOD)*(base%MOD) % MOD, (exp-1)/2 ) ) % MOD;
    else
        return power((base%MOD)*(base%MOD) % MOD, exp/2) % MOD;
}

int main()
{
	freopen("ssnd.in", "r", stdin);
	freopen("ssnd.out", "w", stdout);
	scanf("%d", &t);
    erathostenes();
	while( t-- )
	{
        scanf("%d", &nr);
        sum_div=nr_div=1;
        for(i=1; prime[i] * prime[i]<=nr && i<=k; ++i)
            if( !(nr % prime[i]) )
            {
                exp=0;
                while( !(nr % prime[i]) )
                {
                    ++exp;
                    nr/=prime[i];
                }
                nr_div  *= (exp+1);
                sum_div *= ( power(prime[i], exp+1) -1 ) / (prime[i] -1) % MOD;
            }
        if( nr>1 )
        {
            nr_div *= 2;
            sum_div *= (( nr * nr -1 ) / (nr-1) ) % MOD;
        }
        printf("%d %lld\n", nr_div, sum_div);
	}
	return 0;
}