Cod sursa(job #580431)

Utilizator ChallengeMurtaza Alexandru Challenge Data 13 aprilie 2011 08:21:12
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>

using namespace std;

const char InFile[]="ssnd.in";
const char OutFile[]="ssnd.out";
const int MaxN=1000100;
const int MOD=9973;

ifstream fin(InFile);
ofstream fout(OutFile);

int nrd,t,sum;
long long n;
char pciur[MaxN];
int nrp[MaxN];

inline void ciur()
{
	for(register int i=2;i<MaxN;++i)
	{
		if(pciur[i]==0)
		{
			nrp[++nrp[0]]=i;
			for(register int j=i<<1;j<=MaxN;j+=i)
			{
				pciur[j]=1;
			}
		}
	}
}

inline int mypow(int A, int B)
{
	int sol=1;
	for(;B;B>>=1)
	{
		if((B&1)==1)
		{
			sol*=A;
			sol%=MOD;
		}
		A*=A;
		A%=MOD;
	}
	return sol;
}

int main()
{
	ciur();
	fin>>t;
	for(register int i=0;i<t;++i)
	{
		fin>>n;
		nrd=1;
		sum=1;
		for(register int j=1;(long long)(nrp[j])*(long long)(nrp[j])<=n;++j)
		{
			if(n%nrp[j])
			{
				continue;
			}
			int p=0;
			while(n%nrp[j]==0)
			{
				++p;
				n/=nrp[j];
			}
			nrd*=(p+1);
			sum*=mypow(nrp[j],p+1)-1;
			sum%=MOD;
			sum*=mypow(nrp[j]-1,MOD-2);
			sum%=MOD;
		}
		if(n>1)
		{
			nrd<<=1;
			n%=MOD;
			sum*=(n*n-1)/(n-1);
			sum%=MOD;
		}
		fout<<nrd<<" "<<sum<<"\n";
	}
	fout.close();
	fin.close();
	return 0;
}