Cod sursa(job #1476679)

Utilizator k_ounu_eddyIacob Eduard k_ounu_eddy Data 25 august 2015 12:39:14
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include<stdio.h>
#include<string.h>
#define MOD 9973
#define MAX 100001

bool prim[1000001];
int nrPrime[100001];
int cntNrPrime = 1;

void ciur()
{
    nrPrime[cntNrPrime++] = 1;
    for(int i=2;i<MAX;i++)
    {
        int j=i;
        if(prim[j] == true)
        {
            nrPrime[cntNrPrime++] = j;
            for(j;j<=MAX;j+=i)
                prim[j] = false;
        }
    }
}

inline int pow(int x, int p) {
    // INFOARENA
    int rez = 1;
    x %= MOD;
 
    for(; p; p >>= 1) {
        if(p & 1) {
            rez *= x;
            rez %= MOD;
        }
 
        x *= x;
        x %= MOD;
    }
 
    return rez;
}

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

    int t;
    long long n;
    scanf("%d", &t);

    memset(prim, true, 100001);
    ciur();
    for(int i=1;i<=t;i++)
    {        
        int cnt =1;
        scanf("%lld", &n);

        long long N = n;
        long long sum = 1;
        for(int ii=2;nrPrime[ii] * nrPrime[ii]<=N;ii++)
        {
            int d = 0;
            while(n%nrPrime[ii] == 0 )
            {
                n/=nrPrime[ii];
                d++;
            }
            cnt *= (d+1);

// infoarena
             long long p1 = (pow(nrPrime[ii], d+1) - 1) % MOD;
             long long p2 = pow(nrPrime[ii]-1, MOD-2) % MOD;
         
             sum = (((sum * p1) % MOD) * p2) % MOD;
// infoarena
        }

        if(n>1)
        {
            cnt *=2;  // nu inteleg de ce
            sum = (1LL*sum*(n + 1)) % MOD; // nu inteleg de ce
        }

        printf("%d %lld\n",cnt, sum);
    }
}