Cod sursa(job #1527534)

Utilizator mister_adyAdrian Catana mister_ady Data 18 noiembrie 2015 11:54:44
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<iostream>
#include<fstream>
#include<cmath>
  using namespace std;
  
  ifstream f("ssnd.in");
  ofstream g("ssnd.out");
  
  void prime(long int v[1000006] , long int n)
  {
    int i; 
    v[1] = 0;
    for ( i = 2 ; i <= n/2 ; i++ )
      v[i] = i;
    int j;
    for ( i = 2 ; i <= n/2 ; i++ )
      {
        if (v[i] == i)
        {
          for( j = i + i ; j <= n/2 ; j = j + i )
          v[j] = 0;  
        }
      }
  }

  int impartire(long int n, long int i)
  { 
    int S = 0;
    while(n % i == 0)
      {
        S = S + 1;
        n = n / i;
      }
    return S;
  }

  void vectordiv(long int n, long int v[1000006])
  {
    prime(v,n); 
    for(int i = 2 ; i <= n/2 ; i++)
    {
      if(v[i] != 0)
      v[i] = impartire(n,v[i]) + 1;  
    }
  }

  int serie(long int i, long int v)
  { 
    int S = 1;
      while(v != 1)
      {
        S = S + pow(i,(v-1));
        v--;
      }
    return (S % 9973);
  }

  int suma(long int n)
  { 
    long int S = 1;
    long int v[1000006];
    vectordiv(n,v);
    for(int i = 2 ; i <= n/2 ; i++)
      if(v[i] != 0)
        S = S * serie(i,v[i]);
    if(S == 1)
      S = n + 1;
    return S;
  }

  int div(long int n)
  {
    long int v[1000006];
    vectordiv(n,v);
    long int nrdiv = 1;
    for(int i = 2 ; i <= n/2 ; i++)
      if(v[i] != 0)
        nrdiv = nrdiv * v[i];
    if (nrdiv == 1)
      return 2;
    else
      return nrdiv;
  }

  long int v[1000006];

  int main()
  {
    long int n;
    f>>n;
    int i;
    int x;
    for( i = 1 ; i <= n ; i++)
    {f>>x;    
    g<<div(x)<<" "<<suma(x)<<endl;
    }    
    return 0;
  }