Cod sursa(job #734013)

Utilizator gabrielvGabriel Vanca gabrielv Data 13 aprilie 2012 13:23:08
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
using namespace std;
#include<fstream>
#include<bitset>
#define MAX 1000005
#define MAX2 78600
#define MOD 9973
bitset <MAX> ciur;
int prim[MAX2],k;
void ciur_er()
{
	int i,j;
	for(i=2;i<MAX-1;i++)
		if(!ciur[i])
		{
			prim[++k]=i;
			for(j=i+i;j<MAX-1;j+=i)
				ciur[j]=1;
		}
}
/*inline int pow(int x, int p) 
{
	int rez = 1;
	x %= MOD;

	for(; p; p >>= 1) {
		if(p & 1) {
			rez *= x;
			rez %= MOD;
		}

		x *= x;
		x %= MOD;
	}

	return rez;
}*/
int main()
{
	ifstream in ("ssnd.in");
	ofstream out ("ssnd.out");
	int T,c,nrd,i,S,P;
	long long n,m;
	ciur_er();
	in>>T;
	while(T--)
	{
		in>>n;
		nrd=1;
		S=1;
		for(i=1;(1LL*prim[i]*prim[i]<=n)&&(i<=k);i++)
		{
			m=n;
			c=1;
			while(n%prim[i]==0)
			{
				n=n/prim[i];
				c++;
			}
			nrd*=c;
			P=(((m/n)*(1LL*prim[i])-1)/(1LL*prim[i]-1))%MOD;
				/*int p1 = (pow(prim[i], c) - 1) % MOD;
				int p2 = pow(prim[i]-1, MOD-2) % MOD;
				S = (((S * p1) % MOD) * p2) % MOD;*/
			S=(S*P)%MOD;
				
			//S=S*P;
		}
		if(n!=1)
		{
			nrd*=2;
			S=(1LL*S*(n+1))%MOD;
			//S=S*(n+1);
		}
		out<<nrd<<" "<<S<<"\n"; // numar divizori, suma divizori
	}
	return 0;
}