Cod sursa(job #1552924)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 18 decembrie 2015 22:31:26
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <bits/stdc++.h>

using namespace std;

const int MOD = 9973;
bool ciur[1000005];

void sieve(){
    int i,j;
    for(i = 4;i <= 1000000;i += 2){
        ciur[i] = 1;
    }
    for(i = 3;i <= 1000000;i += 2){
        if(ciur[i] == 0){
            for(j = 3*i;j <= 1000000;j += i+i){
                ciur[j] = 1;
            }
        }
    }
}

int lgput(int b, int e){
    int sol = 1;
    while(e){
        if(e&1){
            sol = (1LL*sol*b)%MOD;
        }
        b = (1LL*b*b)%MOD;
        e >>= 1;
    }
    return sol;
}

int main()
{
    int t,test,nrd,sd,i,p,c,j,x;
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);
    scanf("%d",&t);
    sieve();
    for(test = 1;test <= t;test++){
        scanf("%d",&x);
        if(ciur[x] == 0){
            printf("2 %d\n",x+1);
            return 0;
        }
        nrd = 1;
        sd = 1;
        if(x%2 == 0){
            i = 2;
            p = 2;
            c = 0;
            while(x%2 == 0){
                x /= 2;
                p = (1LL*p*2)%MOD;
                c++;
            }
            nrd = nrd*(c+1);
            sd = (1LL*sd*(p-1)*lgput(i-1, MOD-2))%MOD;
        }
        for(i = 3;i*i <= x;i += 2){
            if(x%i == 0){
                j = i;
                p = i;
                c = 0;
                while(x%i == 0){
                    x /= i;
                    p = (1LL*p*i)%MOD;
                    c++;
                }
                nrd = nrd*(c+1);
                sd = (1LL*sd*(p-1)*lgput(j-1, MOD-2))%MOD;
            }
        }
        if(x > 1){
            nrd *= 2;
            sd = (1LL*sd*(x+1))%MOD;
        }
        printf("%d %d\n",nrd,sd);
    }
    return 0;
}