Cod sursa(job #701075)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 1 martie 2012 13:29:14
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include<fstream>
#include<cmath>
#define NMAX 1000010
#define MMAX 100000
#define MOD 9973

using namespace std;

ifstream f("ssnd.in");
ofstream g("ssnd.out");

int prim[MMAX], np;
bool ciur[NMAX];

void Ciur()
{
	int i,j;
	np=1; prim[np]=2;
	for (j=4; j<NMAX; j+=2) ciur[j]=1;
	for (i=3; i<NMAX; i+=2)
		if (!ciur[i])
		{
			prim[++np]=i;
			for (j=i+i; j<NMAX; j+=i) ciur[j]=1;
		}
}

int Solve(int x, int &nr, int &sum)
{
	int rez,p, i,rad;
	//nr de divizori
	nr=1;  sum=(1+x)%MOD; rad=sqrt((double)x);
	for (i=1; i<=prim[i]*prim[i]; ++i)
	{
		rez=1;p=prim[i]; 
		while (x%p==0)
		{
			++rez;
			if (p*p<=x)sum=(sum+p+(x/p))%MOD; 
			p*=prim[i];
		}
		nr*=rez;
	}
	if (rad*rad==x) sum=(sum+MOD-rad)%MOD;
}

void Citeste()
{
	int x, nr, sum, t;
	f>>t;
	while (t--)
	{
		f>>x;
		Solve(x, nr, sum);
		g<<nr<<" "<<sum<<"\n";
	}
}

int main()
{
	Ciur();
	Citeste();
	f.close();
	g.close();
	return 0;
}