Cod sursa(job #1552940)

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

using namespace std;

const int MOD = 9973;
bitset <1000005> ciur;
int len,P[100005];

void sieve(){
    int i,j;
    for(i = 4;i <= 1000000;i += 2){
        ciur[i] = 1;
    }
    P[1] = 2;
    len = 1;
    for(i = 3;i <= 1000000;i += 2){
        if(ciur[i] == 0){
            P[++len] = i;
            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 = (sol*b)%MOD;
        }
        b = (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(x <= 1000000){
            if(ciur[x] == 0){
                printf("2 %d\n",x+1);
                return 0;
            }
        }
        nrd = 1;
        sd = 1;
        for(i = 1;i <= len && 1LL*P[i]*P[i] <= 0LL+x;i++){
            if(x%P[i] == 0){
                c = 1;
                j = P[i];
                p = P[i];
                while(x%P[i] == 0){
                    x /= P[i];
                    c++;
                    p = (p*P[i])%MOD;
                }
                nrd = nrd*c;
                sd = (sd*(p-1)%MOD*lgput(j-1,MOD-2)%MOD)%MOD;
            }
        }
        if(x > 1){
            nrd = nrd*2;
            sd = (sd%MOD*(x+1)%MOD)%MOD;
        }
        printf("%d %d\n",nrd,sd);
    }
    return 0;
}