Cod sursa(job #2495191)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 18 noiembrie 2019 22:42:11
Problema Suma si numarul divizorilor Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.25 kb
#include <cstdio>
#define MOD 9973
#define DIMBUFF 1000005

using namespace std;

FILE *fin, *fout;

long long t, n, i, m, a, b;
long long p[100005], f[1000005];

long long lgput (long long a, long long b){
    if (b == 0){
        return 1;
    }
    else{
        long long r;
        r = lgput (a, b/2);
        if (b%2 == 0){
            return 1LL*r*r%MOD;
        }
        else{
            return 1LL*a*r*r%MOD;
        }
    }
}

void solve (long long n, long long &nrdiv, long long &sumadiv){
    long long i, e, x, d;
    nrdiv = sumadiv = 1;
    for (i=1; 1LL*p[i]*p[i]<=n && n!=1; i++){
        if (n%p[i] == 0){
            d = p[i];
            e = 1;
            while (n%d == 0){
                e++;
                n /= d;
            }
            nrdiv = nrdiv * e;
            x = lgput (d, e) - 1;
            if (x < 0)
                x += MOD;
            x = x * lgput ((d+MOD-1)%MOD, MOD-2)%MOD;
            sumadiv = sumadiv * x % MOD;
        }
    }
    if (n != 1){
        d = n%MOD;
        nrdiv *= 2;
        x = lgput (d, 2) - 1;
        if (x < 0)
            x += MOD;
        x = x * lgput ((d+MOD-1)%MOD, MOD-2)%MOD;
        sumadiv = sumadiv * x % MOD;
    }
}

void precalc (){
    int i, j;
    m = 1;
    p[1] = 2;
    for (i=3; i<=1000000; i+=2){
        if (f[i] == 0){
            p[++m] = i;
            for (j=i+i; j<=1000000; j+=i){
                f[j] = 1;
            }
        }
    }
}

char buff[DIMBUFF];
long long pp;

long long numar() {
    long long val = 0;
    while (!(buff[pp] >= '0' && buff[pp] <= '9')) {
        pp++;
        if (pp == DIMBUFF) {
            fread(buff, 1, DIMBUFF, fin);
            pp=0;
        }
    }
    while (buff[pp] >= '0' && buff[pp] <= '9') {
        val = val*10 + buff[pp] - '0';
        pp++;
        if (pp == DIMBUFF) {
            fread(buff, 1, DIMBUFF, fin);
            pp=0;
        }
    }
    return val;
}

int main(){
    fin = fopen  ("ssnd.in", "r");
    fout = fopen ("ssnd.out", "w");
    fread(buff, 1, DIMBUFF, fin);
    precalc();
    t = numar();
    for (;t--;){
        n = numar();
        solve(n, a, b);
        fprintf (fout, "%lld %lld\n", a, b);
    }
    return 0;
}