Cod sursa(job #1472807)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 17 august 2015 19:46:10
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <stdio.h>
#define ll long long
#define N 1000000
#define MAX 80000
#define R 9973
 
int n, i, j, nprim[MAX], div, d;
bool prim[N];
ll x, aux, nr, sum;
 
void ciur(){
    for(i = 2; i < N; i++)
        if(!prim[i]){
            nprim[++nprim[0]] = i;
            for(j = 2 * i; j < N; j += i)
                prim[j] = 1;
        }
}
 
int putlog(int x, int n);
void ssnd(ll x);
 
int main(){
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);
    ciur();
    scanf("%d", &n);
    for(i = 0; i < n; i++){
        scanf("%lld", &x);
        ssnd(x);
    }
    return 0;
}
 
int putlog(int x, int n){
    int rez = 1;
    x %= R;
    while(n > 0){
        if(n & 1)
            rez = rez * x % R;
        n >>= 1;
        x = x * x % R;
    }
    return rez;
}
 
void ssnd(ll x){
    int i = 1;
    nr = 1;
    sum = 1;
    aux = x;
    while((ll)nprim[i] * nprim[i] <= aux && i <= nprim[0]){
        if(x % nprim[i] == 0){
            div = nprim[i];
            d = 1;
            while(aux % div == 0){
                aux /= div;
                d++;
            }
 
            nr *= d;
        sum = (sum * (putlog(div, d) - 1) % R) * putlog(div - 1, R - 2) % R;
        }
        i++;
    }
 
    if(aux != 1){
        nr *= 2;
        sum = sum * ((aux * aux - 1) / (aux - 1)) % R;
    }
    printf("%lld %lld\n", nr, sum);
}