Cod sursa(job #1463853)

Utilizator tiby10Tibi P tiby10 Data 21 iulie 2015 16:58:14
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>
using namespace std;
const int MAXP=10e6+100;
#define MAXN 1001
#define MOD 9973
int t,n;
int prime[MAXP];
bitset<MAXP>prim;
int indice=1;
void ciur() {
    prim[2]=0;
    prime[1]=2;
    for(int i=3;i<=MAXP;i++){
        if(!prim[i]){
            prime[++indice]=i;
        for(int j=3*i;j<=MAXP;j+=2*i)
            prim[j]=1;
        }
    }
}

int lgpow(int b,int e){
    if(e==0) return 1;
    if(e&1==0){
        b=(1LL*b*b)%MOD;
        return lgpow(b,e/2);
    }
    return (1LL*b*lgpow(b,e-1))%MOD;
}
#define invMod(a) lgpow(a,MOD-2)

void solve(int n) {
    int nrDiv=1,sumaDiv=1;
    int exponent,nrP=0;
    for(int p=1; p<=indice;p++){
        if(prime[p]*prime[p] > n)
            break;
        if(n % prime[p] == 0){
            nrP=prime[p];
            exponent=0;
            while(n%prime[p]==0){
                exponent++;
                n/=prime[p];
            }
            sumaDiv*=(lgpow(nrP,exponent+1)-1)%MOD;
            sumaDiv*=(invMod(nrP-1))%MOD;
            nrDiv*=(exponent+1);
        }
    }
    if(n > 1){
        nrDiv*=2;      // dk+1
        sumaDiv*=(n+1)%MOD;
    }
    printf("%d %d\n",nrDiv,sumaDiv);
}

int main()
{
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);
    scanf("%d",&t);
    ciur();
    int s;
    while(t--) {
        s=0;
        scanf("%d",&n);
        solve(n);
    }
    return 0;
}