Cod sursa(job #1995104)

Utilizator DawlauAndrei Blahovici Dawlau Data 26 iunie 2017 22:59:28
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<fstream>
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
unsigned long long pwr(unsigned long long a,unsigned long long n){
    if(n==1)
        return a;
    else{
        if(n%2==0)
            return pwr(a,n/2)*pwr(a,n/2);
        else
            return a*pwr(a,n-1);
    }
}
pair<int,int> divs(unsigned long long n){
    unsigned long long d,nrdiv=1,sumdiv=1,cnt;
    if(n%2==0){
        cnt=0;
        while(n%2==0){
            ++cnt;
            n/=2;
        }
        nrdiv*=(cnt+1);
        sumdiv*=(pwr(2,cnt+1)-1);
    }
    for(d=3;d*d<=n;d+=2)
        if(n%d==0){
            cnt=0;
            while(n%d==0){
                ++cnt;
                n/=2;
            }
            nrdiv*=(cnt+1);
            sumdiv*=(pwr(d,cnt+1)-1)/(d-1);
        }
    if(n>1){
        nrdiv*=2;
        sumdiv*=(pwr(n,2))/(n-1);
    }
    pair<unsigned long long,unsigned long long>a=make_pair(nrdiv,sumdiv);
    return a;
}
int main(){
    int t;
    fin>>t;
    while(t--){
        unsigned long long nr;
        fin>>nr;
        pair<unsigned long long,unsigned long long>a=divs(nr);
        fout<<a.first<<' '<<a.second<<'\n';
    }
}