Cod sursa(job #1838369)

Utilizator mihai.alphamihai craciun mihai.alpha Data 31 decembrie 2016 20:40:38
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <cstdio>
#include <cmath>
#define Q 1000 * 1000
#define M 9973
FILE *fin, *fout;
char ciur[Q + 1];

inline void ciuri()  {
    for(int i = 2;i <= Q;i++)
        if(ciur[i] == 0)
            for(int j = i * i;j <= Q;j += i)
                ciur[j] = 1;
}

inline int rid(int n, int a)  {
    int p = 1;
    while(a > 0)  {
        if(a % 2 == 1)
            p *= n, p %= M;
        n *= n;
        n %= M;
        a >>=1;
    }
    return p;
}

inline void nrdiv(int n)  {
    int div = 2;
    int sq = sqrt(n);
    long long p = 1, rez = 1;
    while(div <= sq && n > 0)  {
        int p1 = 0;
        while(n % div == 0 && n > 0)
            n /= div, p1++;
        p *= (p1 + 1);
        rez *= rid(div, p1 + 1) - 1;
        rez /= (div - 1);
        rez %= M;
        div++;
    }
    if(n > 1)  {
        div = n;
        int p1 = 0;
        while(n % div == 0 && n > 0)
            n /= div, p1++;
        p *= (p1 + 1);
        rez *= rid(div, p1 + 1) - 1;
        rez /= (div - 1);
        rez %= M;
        div++;
    }
    fprintf(fout, "%lld %lld\n", p, rez);
}


int main()  {
    fin = fopen("ssnd.in", "r");
    fout = fopen("ssnd.out", "w");
    int n;
    fscanf(fin, "%d", &n);
    for(int i = 0;i < n;i++)  {
        int nr;
        fscanf(fin, "%d", &nr);
        nrdiv(nr);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}