Cod sursa(job #678590)

Utilizator nautilusCohal Alexandru nautilus Data 11 februarie 2012 23:11:59
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<fstream>
#include<cmath>
using namespace std;
#define LIMITA 1000000
#define MODULO 9973

int n;
long long x;
bool v[LIMITA+10];
int nrprime,prime[LIMITA];
int nrdiviz,sumadiviz;

void ciur()
{
 int i,j;
 for (i=2; i<=LIMITA; ++i)
	 if (v[i] == 0)
		{
		 prime[++nrprime] = i;
		 for (j=i+i; j<=LIMITA; j+=i)
			 v[j] = 1;
		}
}

void multiplicitate(int diviz)
{
 int multiplu = 0,putere = 1,termen = 1;
 while (x % diviz == 0)
	{
	 x /= diviz;
	 multiplu++;
	 putere *= diviz;
	 termen += putere;
	}
 sumadiviz = (sumadiviz * (termen % MODULO)) % MODULO;
 if (multiplu != 0)
	nrdiviz *= multiplu + 1;
}

void solve()
{
 int i;
 nrdiviz = sumadiviz = 1;
 for (i=1; i<=nrprime && x != 1; ++i)
	 if (x % prime[i] == 0)
		 multiplicitate(prime[i]);
 if (x > 1)
	{
	 nrdiviz = 2;
	 sumadiviz = (1 + x % MODULO) % MODULO;
	}
}

void read()
{
 int i;
 ifstream fin("ssnd.in");
 ofstream fout("ssnd.out");
 fin>>n;
 for (i=1; i<=n; ++i)
	{
	 fin>>x;
	 solve();
	 fout<<nrdiviz<<" "<<sumadiviz<<'\n';
	}
 fin.close();
 fout.close();
}

int main()
{
 ciur();
 read();
 return 0;
}