Cod sursa(job #2197556)

Utilizator al3xionescuIonescu Alexandru al3xionescu Data 22 aprilie 2018 14:48:54
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include<bitset>
using namespace std;
const int MAX_N = 1000005;
const int MOD = 9973;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
long long N;
int T, K, P[MAX_N];
bitset <MAX_N> viz;
void ciur(){
    for(int i=2;i<MAX_N;i++){
        if(viz[i]==0){
            P[++K]=i;
            for (int j=i+i;j<MAX_N;j+=i){
                viz[j]=i;
            }
        }
    }
}
inline int pow(int x, int p){
    int rez=1;
    x%=MOD;
    for(;p;p>>=1){
        if(p&1){
            rez*=x;
            rez%=MOD;
        }
        x*=x;
        x%=MOD;
    }
    return rez;
}
void solve(){
    fin>>N;
    int nd=1,sd=1;
    for(int i=1;i<=K && 1LL * P[i]*P[i]<=N;i++){
        if(N%P[i]) continue;
        int p=0;
        while(N%P[i]==0){
            N/=P[i];
            ++p;
        }
        nd*=(p+1);
        int p1=(pow(P[i],p+1)-1)%MOD;
        int p2=pow(P[i]-1,MOD-2)%MOD;
        sd = (((sd * p1) % MOD) * p2) % MOD;
    }
    if(N>1){
        nd*=2;
        sd=(1LL*sd*(N+1) % MOD);
    }
    fout<<nd<<' '<<sd<<'\n';
}
int main()
{
    ciur();
    for(fin >> T; T; --T)
        solve();

    return 0;
}