Cod sursa(job #1144726)

Utilizator buzu.tudor67Tudor Buzu buzu.tudor67 Data 17 martie 2014 15:15:45
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include<fstream>
#define maxn 1000006
#define maxk 80004
#define ro 9973
using namespace std;
ifstream fi("ssnd.in");
ofstream fo("ssnd.out");

int p[maxk],k=0;
long long x;
int t,nd,sd;
bool b[maxn];

void eratostene(){
     int i,j;
     
     for(i=2;i<maxn;i++) b[i]=1;
     for(i=2;i<maxn;i++) 
      if(b[i]){
               p[++k]=i;
               for(j=2*i;j<maxn;j+=i) b[j]=0;
              }
}

int exponentiere(int a,int n){
    int p=1;
    
    while(n){
             if(n%2) p=(p*a)%ro;
             a=(a*a)%ro;
             n/=2;
            }
            
    return p;    
}


void descompun(long long x,int &nd,int &sd){
     int r,i=1;
     int p1,p2;
     
     while(i<=k && 1LL*p[i]*p[i]<=x)
        {
         if(!(x%p[i])){
                       r=0;
                       while(!(x%p[i])){
                                        x/=p[i];
                                        r++;
                                       }
                       nd*=(r+1);
                       //invers modular
                       p1=(exponentiere(p[i],r+1)-1)%ro;
                       p2=exponentiere(p[i]-1,ro-2)%ro;   
                       sd=(((sd*p1)%ro)*p2)%ro; 
                      } 
         i++;
        } 
        
     //x ramane numar prim
     if(x>1){
             nd*=2;
             sd=(1LL*sd*(x+1)%ro);
            }
}

int main(){
    eratostene();
    fi>>t;

    for(;t>0;t--){
                  fi>>x;
                  
                  nd=1; sd=1;
                  descompun(x,nd,sd);
                  
                  fo<<nd<<" "<<sd<<"\n";
                 }
 
    fi.close();
    fo.close();
    return 0;
}