Cod sursa(job #1552973)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 18 decembrie 2015 23:41:58
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>

using namespace std;

const int MOD = 9973;
const int N = 1000000;
bitset <N+5> ciur;
int len,P[N];

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

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

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