Cod sursa(job #846576)

Utilizator test_13testing test_13 Data 2 ianuarie 2013 14:33:43
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <cstring>
#include <vector>
#include <deque>
#include <set>
using namespace std;
#define Max 9973

unsigned char p[250001];
int pr[80000],nr;

void ciur()
{
	int i=2;
	while(i<=1000)
	{
		while(p[i/8]&(1<<(i%8)))i++;
		for(int j=i*i;j<=1000000;j+=i)p[j/8]|=(1<<(j%8));
		i++;
	}

	for(int i=2;i<=1000000;i++)
		if(!(p[i/8]&(1<<(i%8))))
		{
			nr++;
			pr[nr]=i;
		}
}

void desc(long long a)
{
	int d=1,i=1,r;
	long long s=1,p;
	while(pr[i]*pr[i]<=a)
	{
		if(a%pr[i]==0)
		{
		p=pr[i];
		r=0;
		while(a%pr[i]==0)
		{
			r++;
			a/=pr[i];
			p*=pr[i];
		}
		d*=r+1;
		s=(s*(p-1)/(pr[i]-1))%Max;
		}
		i++;
	}
	if(a!=1)
	{
		s=(s*(a*a-1)/(a-1));
		d*=2;
	}
	printf("%d %lld\n",d,s
		);
}

int main()
{
	int n;
	long long a;
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
		scanf("%d",&n);
		ciur();
		while(n--)
		{
			scanf("%lld",&a);
			desc(a);
		}
	return 0;
}