Cod sursa(job #764496)

Utilizator Alexandru13Dumitraiche Marius-Alexandru Alexandru13 Data 5 iulie 2012 13:44:10
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define mod 9973
bool a[1000001];
long long int p[500001],k=0;
using namespace std;
void ciur()
{
	for(int i=2;i<=1000001;i++)
		if(a[i]==false)
		{
			p[++k]=i;
			for(int j=i+i;j<=1000001;j+=i)
				a[j]=true;
		}
}
long long int putere(long long int baza,long long int exp)
{
	long long int rez=1;
	while(exp)
	{
		if(exp%2)
			rez*=baza;
		baza*=baza;
		exp/=2;
	}
	return rez;
}
int main()
{
	long long int t,x,s,nr,d;
	ciur();
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	scanf("%lld", &t);
	while(t--)
	{
		s=nr=1;
		scanf("%lld",&x);
		for(int i=1;i<=k && p[i]*p[i]<=x;i++)
			if(x%p[i]==0)
			{
				d=0;
				while(x%p[i]==0)
				{
					d++;
					x=x/p[i];
				}
				nr=nr*(d+1);
				s=(s*((putere(p[i],d+1)-1)/(p[i]-1)))%mod;
			}
		if(x>1)
		{
			nr=nr*2;
			s=(s*(x+1))%mod;
		}
		printf("%lld %lld\n",nr,s);
	}
	return 0;
}