Cod sursa(job #1220999)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 19 august 2014 10:27:37
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <list>
#include <cmath>
#include <bitset>
#define DIM 1000000
#define MOD 9973
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
int T,x;

list<int> P;
list<int>::iterator it;
bitset<DIM+11> viz;

void eratostenes(){
    for(register int i=2;i<DIM;i++)
        if(!viz[i]){
            P.push_back(i);
            for(register int j=i+i;j<DIM;j+=i)   viz[j]=1;
        }
}


int nrdiv(int x){
    int nr=1,q,y=x;
    for(it=P.begin();it!=P.end();it++){
        if(*it>sqrt(y))
            break;
        q=0;
        while(x%(*it)==0){
            x/=*it,q++;
        }
        nr*=(q+1);
    }
    if(x!=1)    nr*=2;
    return nr;
}

int p(int a,int &b){
    int nr=0;
    while(b%a==0)
        nr++,b/=a;
    return nr;
}

int up(int a,int b){
    if(b==1)
        return a;
    else{
        int q=up(a,b/2);
        q%=MOD;
        q*=q,q%=MOD;
        if(b%2==1)  q*=a,q%=MOD;
        return q;
    }
}

int invmod(int x){
    return up(x,MOD-2);
}

int sumdiv(int x){
    int sum=1,a,b,y=x;
    for(it=P.begin();it!=P.end() && x!=1;it++){
        if(x%(*it))
            continue;
        b=p(*it,x);
        a=up(*it,b+1)-1;
        if(a<0) a+=MOD;
        b=invmod(*it-1);
        sum*=(a*b)%MOD,sum%=MOD;
    }
    return sum;
}

int main(void){
    register int i,j;
    eratostenes();

    f>>T;
    for(;T;T--){
        f>>x;
        g<<nrdiv(x)<<" "<<sumdiv(x)<<"\n";
    }

    return 0;
}