Cod sursa(job #852964)

Utilizator Luncasu_VictorVictor Luncasu Luncasu_Victor Data 11 ianuarie 2013 22:40:38
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <deque>
#include <set>
#include <stack>
#include <cassert>
using namespace std;

#define PRO "ssnd"
void OpenFiles(int EVAL)
{
	if(EVAL)
	{
		char input[100] = PRO, output[100] = PRO;
		freopen(strcat(input, ".in"),"r",stdin);
		freopen(strcat(output,".out"),"w",stdout);
	} else
	{
		freopen("test.in","r",stdin);
		//freopen("test.out","w",stdout);
	}
}

#define MAX  9973
#define INF 0xffffff

unsigned char p[MAX/8+1];
int nr,pr[80000];

void Ciur()
{
    int i=2;
    while(i<=1414)
    {
        while(p[i/8]&(1<<(i%8)))i++;
        for(int j=i*i;j<MAX;j+=i)p[j/8]|=1<<(j%8);
        i++;
    }
    for(int i=2;i<MAX;i++)
        if(!(p[i/8]&(1<<(i%8))))pr[++nr]=i;
}

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

int main(int argv,char *args[])
{
	OpenFiles(argv==0);
	// start
	int n;
	long long a;
		Ciur();
		scanf("%d",&n);
		while(n--)
		{
			scanf("%lld",&a);
			desc(a);
		}

	return 0;
}