Cod sursa(job #687246)

Utilizator ChallengeMurtaza Alexandru Challenge Data 22 februarie 2012 11:07:29
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <vector>
#include <bitset>

using namespace std;

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

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

int T,nrd;
long long N,S;
bitset<SqrtMaxN> pciur;
vector<int> nrp;

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

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

int main()
{
	ciur();
	
	fin>>T;
	for(register int i=1;i<=T;++i)
	{
		fin>>N;
		nrd=1;
		S=1;
		for(vector<int>::iterator it=nrp.begin();it!=nrp.end() && (long long)(*it)*(long long)(*it)<=N;++it)
		{
			if(N%(*it)==0)
			{
				N/=*it;
				int e=1;
				while(N%(*it)==0)
				{
					++e;
					N/=*it;
				}
				nrd*=(e+1);
				S*=mypow(*it,e+1)-1;
				S%=MOD;
				if(S<0)
				{
					S+=MOD;
				}
				S*=mypow(*it-1,MOD-2);
				S%=MOD;
			}
		}
		if(N>1)
		{
			nrd<<=1;
			S*=(N+1)%MOD;
			S%=MOD;
		}
		fout<<nrd<<" "<<S<<"\n";
	}
	fin.close();
	fout.close();
	return 0;
}