Cod sursa(job #495141)

Utilizator ChallengeMurtaza Alexandru Challenge Data 24 octombrie 2010 08:57:44
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 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;
			}
		}
	}
}

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