Cod sursa(job #1342493)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 14 februarie 2015 03:40:22
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <bitset>
#define DIM 10001
#define MOD 9973

using namespace std;

ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

long long T,N,prim[10000],k,sol,s;
bitset <DIM> ciur;
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;
}
int main(){
    ciur[0]=ciur[1]=1;
    for(int i=2;i<=DIM;i++)
        if(!ciur[i]){
            prim[++k]=i;
            for(int j=i+i;j<=DIM;j+=i)
                ciur[j]=1;
        }
    fin>>T;
    while(T--){
        fin>>N;
        sol=1;
        s=1;
        for(int i=1;prim[i]*prim[i]<=N && i<=k;i++){
            if(N%prim[i])
                continue;
            int nr=0;
            if(N%prim[i]==0){
                while(N%prim[i]==0)
                    nr++,N/=prim[i];
                sol*=(nr+1);
                long long p1=(pow(prim[i],nr+1)-1)%MOD;
                long long p2=pow(prim[i]-1,MOD-2)%MOD;
                s=(((s*p1)%MOD)*p2)%MOD;
            }
        }
        if(N>1){
            sol*=2;
            s=(1LL*s*(N+1))%MOD;
        }
        fout<<sol<<" "<<s<<"\n";
    }
    fin.close();fout.close();
    return 0;
}