Cod sursa(job #662577)

Utilizator razielreaperMatei Andrei razielreaper Data 16 ianuarie 2012 20:16:19
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <stdio.h>

#define HMAX 200010
#define NMAX 200010

int position[NMAX];
int values[NMAX];
int heap[HMAX];
int heap_n;

int cmp(int x, int y)
{
	return values[x] < values[y];
}

inline void swap(int *x, int *y)
{ /* codul merge acum :) */
	int r = *x;
	*x = *y;
	*y = r;
}

void heap_push(int i)
{
	if ( i == 0 )
		return;
	int t = (i-1) / 2;
	if ( cmp(heap[i], heap[t]) )
	{
		swap(position + heap[i], position + heap[t]);
		swap(heap + i, heap + t);
		heap_push(t);
	}
}
# include <stdio.h>
#include<math.h>
int p[1000005],i,j,k,suma,prod,t,nr,z,q,nr1,s;
bool viz[1000005],ok;
long long int a,b,aux,x,n,y;
char ch;
long long pow1(long long int a, long long int b)
{
	long long int aux;
	if (b==0) return 1;
	else
		if (b%2==0)
		{
			aux=pow1(a,b/2);
			return (aux*aux);
		}
		else
			return (a*pow1(a,b-1));
}
int main()
{
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	scanf("%d\n",&n);
	k=0;
	p[++k]=2;
	for (i=3; i<=1000005; i+=2)
		if (viz[i]==false)
		{
			p[++k]=i;
			for (j=3*i; j<=1000005; j+=2*i)
				viz[j]=true;
		}
	for (t=1; t<=n; t++)
	{
		x=0;
        scanf ("%c",&ch);
        while (ch!='\n')
        {
          x*=10;
          x+=ch-'0';
          scanf ("%c",&ch);
        }
		ok=false;
		i=1; suma=1; prod=1; s=x;
		while (p[i]<=sqrt(x))
		{
			if (x%p[i]==0)
			{
				ok=true;
				nr=1;
				while (x%p[i]==0)
				{
					nr++;
					x/=p[i];
				}
				prod=(prod*nr)%9973;
				z=p[i]; q=nr;
				y=pow1(z,q);
				suma=(suma*((y-1)/(p[i]-1)%9973)%9973)%9973;
			}
			i++;
		}
		if (x!=1)
			{prod=(prod*2)%9973;
		suma=(suma*((x*x-1)/(x-1)))%9973;}
		printf("%d %d\n",prod,suma);
	}
	return 0;
		
}