Cod sursa(job #2379190)

Utilizator sansRotaru Razvan Andrei sans Data 13 martie 2019 07:46:50
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <bits/stdc++.h>
using namespace std;
#define M 1000000
#define MOD 9973
int prime[400000], k;
bitset <M>ciuruit;
long long putere(long long x, long long n){
    long long y = 1;
    if(n==0) return 1;
    else if(n==1) return x;
    else{
        while(n>1){
            if(n%2==0){
                x = (x*x)%MOD;
                n/=2;
            }
            else{
                y = (x*y)%MOD;
                x = (x*x)%MOD;
                n = (n-1)/2;
            }
        }
        return (x*y)%MOD;
    }

}
void ciur(){
    for(int i = 2; i<=1000; i++){
        if(!ciuruit[i]){
            for(int j = 2; j<=M/i; j++) ciuruit[i*j] = 1;
        }
    }
    prime[k++] = 2;
    for(int i = 3; i<=M; i+=2) if(!ciuruit[i]) prime[k++] = i;
}
int getsumanddivs(long long x, int &sum){
    sum = 1;
    int p = 1, d = 0, e = 0;
    int f = prime[d++];

    while(x%f==0){
        e++;
        x/=f;
    }
    if(e){
        p*=(e+1);
        sum*=(putere(f, e+1)-1)/(f-1) % MOD;
    }
    f = prime[d++];
    while(f*f<=x){
        e = 0;
        while(x%f==0){
            e++;
            x/=f;
        }
        if(e){
            p*=(e+1);
            sum*=(putere(f, e+1)-1)/(f-1)%MOD;
        }
        f = prime[d++];
    }
    if(x>1){
        p*=2;
        sum*=((putere(x, 2)-1)/(x-1))%MOD;
    }
    return p;
}
int main(){
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);
    ciur();
    int n;
    int x, sum;
    scanf("%d", &n);
    for(int i = 1; i<=n; i++){
        scanf("%d", &x);
        int h  = getsumanddivs(x, sum);
        printf("%d %d\n", h, sum);
    }
}