Cod sursa(job #1838406)

Utilizator mihai.alphamihai craciun mihai.alpha Data 31 decembrie 2016 21:53:56
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdio>
#include <bitset>

#define Q 1000 * 1000
#define M 9973
FILE *fin, *fout;
std::bitset <Q + 1>ciur;
int v[Q + 1], ind;
inline void ciuri()  {
    ind = 1;
    v[0] = 2;
    for(long long i = 3;i <= Q;i+=2)
        if(ciur[i] == 0)  {
            v[ind++] = i;
            for(long long j = i * i;j <= Q;j += i)
                ciur[j] = 1;
        }
}

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

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

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