Cod sursa(job #1463787)

Utilizator tiby10Tibi P tiby10 Data 21 iulie 2015 15:52:54
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>
using namespace std;
const int MAXP=10e6+100;
#define MAXN 1001
#define MOD 9973
int t,n;
vector<int> prime;
bitset<MAXP>prim;
void ciur(int n) {
    prim[2]=0;
    prime.push_back(2);
    for(int i=3;i<=n;i++){
        if(!prim[i]){
            prime.push_back(i);
        for(int j=3*i;j<=n;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(auto p : prime){
        if(p*p > n)
            break;
        if(n % p == 0){
            nrP=p;
            exponent=0;
            while(n%p==0){
                exponent++;
                n/=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(MAXP);
    int s;
    while(t--) {
        s=0;
        scanf("%d",&n);
        solve(n);
    }
    return 0;
}