Cod sursa(job #2412718)

Utilizator modulopaulModulopaul modulopaul Data 22 aprilie 2019 15:02:18
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>
#define MAXP 1000005
#define MP 78499
#define MOD 9973
#define ll long long

using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
bool prim[MAXP];
int vp[MAXP];
int npr=0;
void C(){
    prim[0]=prim[1]=1;
    for(int i=2;i<MAXP;i++){
        if(prim[i]==0){
            npr++;
            vp[npr]=i;
            for(int d=2;d*i<=MAXP;d++){
                prim[i*d]=1;
            }
        }
    }
}
int pw(int x,int p){
    int rez=1;
    x%=MOD;
    for(;p!=0;p>>=1){
        if(p&1){
            rez*=x;
            rez%=MOD;
        }
        x*=x;
        x%=MOD;
    }
    return rez;
}
void solve(ll n){
    ll nrd=1,sd=1;
    for(int i=1;i<=npr && 1LL*vp[i]*vp[i]<=n;i++){
        if(n%vp[i]) continue;
        int e=0;
        while(n%vp[i]==0){
            e++;
            n/=vp[i];
        }
        nrd*=(e+1);
        int pw1=(pw(vp[i],e+1)-1)%MOD
        ,pw2=pw(vp[i]-1,MOD-2)%MOD;
        sd*=(((sd*pw1)%MOD)*pw2)%MOD;
    }
    if(n>1){
        nrd*=2;
        sd=(1LL*sd*(n+1)%MOD);
    }
    fout<<nrd<<' '<<sd<<'\n';
}
int main(){
    C();
    int t;
    fin>>t;
    for(int i=1;i<=t;i++){
        ll n;
        fin>>n;
        solve(n);
    }
    return 0;
}