Cod sursa(job #1067573)

Utilizator roby2001Sirius roby2001 Data 27 decembrie 2013 02:20:57
Problema Invers modular Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
/*
    Keep It Simple!
*/
 
#include<stdio.h>
#include<iostream>

#define MOD 9973

int N,X,Erastothene[80000],cnt,nrd,p[80000],d[80000];
bool viz[1000000];


void InitEra()
{
	Erastothene[++cnt] = 2;
	for(int i=3; i<=1000000; i++)
	{
		if(!viz[i])
		{
			Erastothene[++cnt] = i;
			for(int j=i; j<=1000000; j+=i)
				viz[j] = 1;
		}
	}
}

void InitDivs()
{
	int i=1;
	nrd = 0;
	while( X != 1)
	{
		if ( X % Erastothene[i] == 0 )
		{
			p[++nrd] = Erastothene[i];
			d[nrd] = 0;

			while( X % Erastothene[i] == 0 ) { X/= Erastothene[i]; d[nrd]++; }
		}
		i++;
	}
}

long long DivsNumber()
{
	long long nr = 1;
	for(int i=1; i<=nrd; i++)
		nr*=(d[i]+1);
	return nr;
}

int put(int a,int b)
{
	int r = 1;
	while(b)
	{
		if ( b%2 )
		{
			r*=a%MOD;
			b--;
		}
		a*=a%MOD;
		b/=2;
	}
	return r;
}

long long SumDivs()
{
	int   ns=1 ,nj=1;
	for(int i=1; i<=nrd; i++)
	{
		ns *= ( put(p[i],d[i]+1) - 1 );
		ns = ns%MOD;
		nj *= (p[i]-1 % MOD);
	}
	return (ns/nj)%MOD;
}


int main()
{
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);

	scanf("%d",&N);

	InitEra();

	for(int i=1; i<=N; i++)
	{
		scanf("%d",&X);
		InitDivs();
		printf("%lld ",DivsNumber());
		printf("%lld\n",SumDivs());
	}
}