Cod sursa(job #1318340)

Utilizator retrogradLucian Bicsi retrograd Data 15 ianuarie 2015 21:08:50
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include<fstream>
#include<vector>

#define mod 9973

using namespace std;

typedef int var;

ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

vector<var> PRIME;
bool prim[1000010];
vector<var> P, E;
var nrdiv, sdiv;

var exp(var b, var e) {
    var prod = 1;
    while(e) {
    if(e%2) {
        prod = (prod*b)%mod;
        e--;
    } else {
        b = (b * b)%mod;
        e /= 2;
    }
    }
    return prod;
}

var inv (const var &x) {
    return exp(x, mod-2);
}

void genprim(var t) {
    var i;
    prim[1] = true;
    for(i=2; i*i<=t; i++) {
        if(!prim[i]) {
            PRIME.push_back(i);
            for(var j=i*2; j<=t; j+=i) {
                prim[j] = true;
            }
        }
    }
    for(; i<=t; i++) {
        if(!prim[i])
            PRIME.push_back(i);
    }
}

void descompune(var t) {
    nrdiv = sdiv = 1;
    P.clear();
    E.clear();
    for(var i=0; PRIME[i] * PRIME[i] <=t; i++) {
        if(t%PRIME[i] == 0) {
            P.push_back(PRIME[i]);
            E.push_back(0);
            while(t%PRIME[i] == 0) {
                E[E.size() - 1] ++;
                t /= PRIME[i];
            }
            var e = E[E.size() - 1];
            nrdiv *= (e + 1);
            sdiv *= (((exp(PRIME[i], e+1) + mod - 1)%mod) * inv((PRIME[i] - 1 + mod)%mod))%mod;
        }
    }
    if(!prim[t]) {
        nrdiv *= 2;
        sdiv *= (((t*t - 1 + mod)%mod) * inv((t+mod-1)%mod))%mod;
    }
}

int main() {
    var t, x;
    fin>>t;
    genprim(1000010);
    while(t--) {
        fin>>x;
        descompune(x);
        fout<<nrdiv<<" "<<sdiv<<'\n';
    }
    return 0;
}