Cod sursa(job #651806)

Utilizator geniucosOncescu Costin geniucos Data 21 decembrie 2011 17:36:16
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<stdio.h>
using namespace std;
long long nr1,r,aux,nr,s,imn,i10,p,t10,i,j,maxi,a[1000005],d[1003],pr[1000005];
long long ridic(long long a1,long long b1)
{
	long long p2;
	p2=1;
	while(b1>0)
	{
		if(b1%2==0)
		{
			a1=(1LL*a1*a1)%r;
			b1=b1/2;
		}
		else
		{
			p2=(1LL*p2*a1)%r;
			b1--;
		}
	}
	return p2;
}
int main()
{
freopen("ssnd.in","r",stdin);
freopen("ssnd.out","w",stdout);
scanf("%lld",&t10);
for(i=1;i<=t10;i++)
{
	scanf("%lld",&d[i]);
	if(d[i]>maxi) maxi=d[i];
}
a[1]=1;
for(i=1;i*i<=maxi;i++)
	;
maxi=i;
for(i=2;i<=maxi;i++)
	if(a[i]==0)
	{
		for(j=i*2;j<=maxi;j=j+i)
			a[j]=1;
	}
r=9973;
for(i=1;i<=maxi;i++)
	if(a[i]==0)
	{
		nr1++;
		pr[nr1]=i;
	}
for(i10=1;i10<=t10;i10++)
{
	p=1;
	s=1;
	aux=d[i10];
	for(j=1;j<=nr1&&1LL*pr[j]*pr[j]<=aux;j++)
		if(aux%pr[j]==0)
		{
			nr=0;
			while(aux%pr[j]==0)
			{
				aux=aux/pr[j];
				nr++;
			}
			p=p*(nr+1);
			s=(s*(ridic(pr[j],nr+1)-1)*ridic(pr[j]-1,9971))%9973;
		}
	if(aux>1)
	{
		j=nr1+1;
		pr[j]=aux;
		nr=1;
		p=p*(nr+1);
		s=(s*(ridic(pr[j],nr+1)-1)*ridic(pr[j]-1,9971))%9973;
	}
	printf("%lld %lld\n",p,s);
}
return 0;
}