Cod sursa(job #993267)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 3 septembrie 2013 16:11:23
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <vector>
#include <cmath>
using std::vector;

const int NR_PRIMES_BELOW_ONE_MILION=78498;
const int MODULO=9973; //it is a prime

void calc_primes(vector<unsigned> &primes,vector<bool> &ciur,unsigned limit){
    primes[0]=2;
    unsigned c=1;
    ciur[0]=false;
    for(unsigned i=3;i<limit;i+=2)
        if(ciur[i>>1]){
            primes[c++]=i;
            for(unsigned j=3;j*i<limit;j+=2) ciur[(i*j)>>1]=false;
        }
}

int main(){
    std::ifstream fin("ssnd.in");
    std::ofstream fout("ssnd.out");

    short t;
    fin>>t;

    vector<unsigned> primes(NR_PRIMES_BELOW_ONE_MILION);
    vector<bool> ciur(500000,true);
    calc_primes(primes,ciur,1000000);

    while(t--){
        unsigned n,sqrtn;
        fin>>n; sqrtn=std::sqrt(n);

        unsigned long long nrdiv=1,sumdiv=1;
        for(unsigned i=0;primes[i]<=sqrtn;++i){
            unsigned p=primes[i];
            if(n%p==0){
                unsigned d=0;
                while(n%p==0){ ++d; n/=p; }
                nrdiv=(nrdiv*(d+1))%MODULO;
                sumdiv=( sumdiv * (static_cast<int>(std::pow(p,d+1))-1) / (p-1) )%MODULO;
            }
        }
        if( n==2 || ((n&1)&&ciur[n>>1]) ){nrdiv+=1;sumdiv+=n;}
        fout<<nrdiv<<' '<<sumdiv<<'\n';
    }
}