Cod sursa(job #1287716)

Utilizator dorinmoldovanMoldovan Dorin dorinmoldovan Data 7 decembrie 2014 22:49:21
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include "stdio.h"
#include <bitset>
using namespace std;

#define MAX 1000001
#define MOD 9973

FILE *f, *g;

long long N;
int T, K = 0;
int prime[MAX];
bitset <MAX> visited;

void ciur() 
{
	for(int i = 2; i < MAX; i++)
	{
		if(visited[i] == 0)
		{
			prime[++K] = i;
			for(int j = i + i; j < MAX; j = j + i)
				visited[j] = 1;
		}
	}
}

int power(int x, int p)
{
	int result = 1;

	x = x % MOD;

	for( ; p; p >>=1)
	{
		if(p & 1)
		{
			result = result * x;
			result = result % MOD;
		}

		x = x * x;
		x = x % MOD;
	}
	
	return result;
}

int main()
{
	f = fopen("ssnd.in", "r");
	g = fopen("ssnd.out", "w");

	ciur();

	fscanf(f, "%d", &T);
	for(int i = 1; i <= T; i++)
	{
		fscanf(f, "%lld", &N);

		int number = 1;
		int sum = 1;

		for(int j = 1; j <= K && 1LL * prime[j] * prime[j] <= N; j++)
		{
			if(N % prime[j] != 0)
				continue;

			int p = 0;

			while(N % prime[j] == 0)
			{
				N = N / prime[j];
				p++;
			}

			number = number * (p+1);

			int nr1 = (power(prime[j], p+1) - 1) % MOD;
			int nr2 = power(prime[j] - 1, MOD - 2) % MOD;

			sum = (((sum * nr1) % MOD) * nr2) % MOD;
		}
		
		
		// N is prime
		if(N > 1)
		{
			number = number * 2;
			sum = (1LL * sum * (N+1)) % MOD; 
		}
		
		fprintf(g, "%d %d\n", number, sum);
	}



	fclose(f);
	fclose(g);

	return 0;
}