Cod sursa(job #634400)

Utilizator ContraPunctContrapunct ContraPunct Data 16 noiembrie 2011 11:15:43
Problema Suma si numarul divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<fstream>
#include<bitset>
#include<vector>

const long long Nmax = 10000006;
const int MOD = 9973;

using namespace std;

bitset<Nmax> ciur;
vector<long long> prime;
vector<long long> a;
long long n;
long long nr=1;
long long suma=1;
long long max1=-1;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");


void Ciur ()
{
	long long i = 0 ,j = 0;
	prime.push_back(2);
	max1= min( max1, Nmax);
	for(i=3; i<=max1; i+=2)
		if(!ciur[i]) 
		{
			prime.push_back(i);
			for(j = i*i; j<= max1; j += (i+i))
				if(!ciur[j])
					ciur[j]=1;
		}
}

void Sol()
{
	int i,j;
	nr = 1;
	long long suma = 1;
	for( i = 0; prime[i] <= n; ++i)
	{
		if( n == prime[i] && nr == 1 && suma == 1)
		{
			fout<<2<<" "<<(1+n)%MOD<<"\n";
			return;
		}
		if( n % prime[i] == 0)
		{
			int exp; 
			long long prod;
			for (exp=0, prod=1; n%prime[i]==0; n/=prime[i])
			{
				++exp;
				prod = prod * prime[i];
				prod = prod % MOD;
			}
			nr = nr * (exp+1);
			suma = suma * ((prime[i] * prod) - 1 ) / ( prime[i] - 1) % MOD;
			suma = suma  % MOD;
		}
	}
	fout<<nr<<" "<<suma<<"\n";
}
int t;
void ReadData()
{
	fin>>t;
	int i;
	for( i=0;i<t;i++)
	{
		fin>>n;
		a.push_back(n);
		if( max1 < n)
			max1 = n;
	}
	max1 = max1 / 2;
	
}
int main()
{
	//Ciur();
	ReadData();
	int i;
	Ciur();
	for( i= 0;i<t;i++)
	{
		n= a[i];
		Sol();
	}
	fout.close();
	fin.close();
	return 0;
}