Cod sursa(job #2107090)

Utilizator arcoC. Nicolae arco Data 16 ianuarie 2018 19:03:15
Problema Suma divizorilor Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>

#define M 9901

uint64_t modexp(uint64_t x, uint64_t n);

int main(void)
{
	FILE *in =  fopen("sumdiv.in", "r");
	FILE *out = fopen("sumdiv.out", "w");

	if(in != NULL && out != NULL)
	{
		uint64_t a, b;
		fscanf(in, "%llu%*c%llu%*c", &a, &b);

		uint64_t facts[10000], powers[10000], d = 2, n = a, idx = 0;
		while(n > 1)
		{
			uint64_t p = 0;
			while(n % d == 0)
			{
				p++;
				n /= d;
			}
			if(p)
			{
				facts[idx] = d;
				powers[idx] = p;
				idx++;
			}
			d++;
			if(n > 1 && d * d > n)
			{
				d = n;
			}
		}
		d = 0;
		for(; d < idx; d++)
		{
			powers[d] = ((powers[d] % M) * (b % M)) % M;
		}

		uint64_t res = 1;
		d = 0;
		for(; d < idx; d++)
		{
			uint64_t s = 1;
			uint64_t i = 1;
			for(; i <= powers[d]; i++)
			{
				s = ((s % M) + (modexp(facts[d], i) % M)) % M;
			}
			res = ((res % M) * (s % M)) % M;
		}
		printf("%llu\n", res);

		fclose(in);
		fclose(out);
	}
	else
	{
		printf("file error\n");
	}

	return 0;
}

uint64_t modexp(uint64_t x, uint64_t n)
{
	uint64_t res = 1;
	while(n)
	{
		if(n % 2 != 0)
		{
			res = ((res % M) * (x % M)) % M;
		}
		x = ((x % M) * (x % M)) % M;
		n /= 2;
	}
	return res;
}