Cod sursa(job #1398672)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 24 martie 2015 12:43:52
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include<fstream>
#include<cmath>
#include<bitset>
#define mod 9973
using namespace std;
int i, j, sum, nr, nrp, e, t, a, b, r;
long long n, aux;
bitset<1000002> c;
int p[100000];
int putere(int x, int p){
    if(p == 0){
        return 1;
    }
    else{
        int a = putere(x, p / 2);
        if(p % 2 == 0){
            return a * a % mod;
        }
        else{
            return a * a % mod * x % mod;
        }
    }
}
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
int main(){
    for(i = 2; i <= 1000000; i++){
        if(c[i] == 0){
            p[++nrp] = i;
            for(j = i + i; j <= 1000000; j += i){
                c[j] = 1;
            }
        }
    }
    fin>> t;
    for(; t; t--){
        fin>> n;
        aux = n;
        nr = 1;
        sum = 1;
        r = sqrt(n * 1.0);
        for(i = 1; i <= nrp && (long long) p[i] <= r; i++){
            e = 0;
            while(aux % p[i] == 0){
                e++;
                aux /= p[i];
            }
            if(e != 0){
                nr *= (e + 1);
                a = putere(p[i], e + 1);
                a--;
                if(a < 0){
                    a += mod;
                }
                b = putere(p[i] - 1, mod - 2);
                sum = sum * a % mod * b % mod;
            }
        }
        if(aux != 1){
            nr *= 2;
            a = putere(aux, 2);
            a--;
            if(a < 0){
                a += mod;
            }
            b = putere(aux - 1, mod - 2);
            sum = sum * a % mod * b % mod;
        }
        fout<< nr <<" "<< sum <<"\n";
    }
    return 0;
}