Cod sursa(job #957401)

Utilizator radu33Nesiu Radu radu33 Data 4 iunie 2013 22:24:45
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<fstream>
#define NMAX 1000010
#define MO 9973
#include<math.h>
#include<iostream>
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
   
struct factori{int factor;
int p;};
factori divi[256];
long prim[100000];
int t,l=1,k=1;
long long N;
bool v[NMAX];
  
  
void ciur()
{
 int i,j;
 for(i=2;i<NMAX;i++)
       if(v[i]==0)
        {
   prim[k]=i;k++;
            for(j=i+i;j<NMAX;j=j+i)
    v[j]=1;
        }
}//ciuruim numerele pana la 10^6 si le tinem minte in prim
   
   
   

 int suma()
{
 int i,s=1;
 for(i=1;i<=l;i++)
  s=s*(divi[i].p+1);
 return s;
}

inline long long putere(long a,long b)
{
 long long i,p=1;
 for(i=1;i<=b;i++)
  p=p*a;
 return p;
}
   
 
inline int produs()
{
 int i,p=1;
 for(i=1;i<=l;i++)
  p=1LL*p*( putere(divi[i].factor,divi[i].p+1)-1) / (divi[i].factor-1)%MO;
   
   
   
   
return p%MO;
}
   
  
  
void incarcare()
{int i;
   
 for(i=1;i<k&&prim[i]<=NMAX;i++)//daca e un factor prim
 {
  if(N%prim[i]==0)//daca e divizor
  {
   divi[l].factor=prim[i];//incarcam ca fiind factor
   while(N%prim[i]==0)//calculam puterea
   {
    N/=prim[i];divi[l].p++;
   }
   l++;
  }
  
 }
 
}

int main()
{
 int i;f>>t;
 ciur();
 for(i=1;i<=t;i++)
 {
  f>>N;
  incarcare();
  g<<suma()<<" ";
  g<<produs()<<"\n";
  l=1;
 }
 return 0;
}