Cod sursa(job #2122330)

Utilizator arcoC. Nicolae arco Data 4 februarie 2018 21:52:00
Problema Suma divizorilor Scor 50
Compilator c Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>
#include <math.h>

typedef unsigned int uint;

#define M 9901

void fact(uint64_t a, uint64_t b, FILE *out);
uint64_t binexp(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", &a, &b);
		fact(a, b, out);

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

	return 0;
}

uint64_t binexp(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;
}

void fact(uint64_t a, uint64_t b, FILE *out)
{
	uint64_t s = 1;
	uint64_t d = 2;
	while(a > 1)
	{
		uint64_t p = 0;
		while(a % d == 0)
		{
			p++;
			a /= d;
		}
		if(p)
		{
			uint64_t c = 1;
			uint64_t i = 1;
			p = ((p % M) * (b % M)) % M;
			for(; i <= p; i++)
			{
				uint64_t calc = binexp(d, i);
				c = ((c % M) + (calc % M)) % M;
			}
			s = ((s % M) * (c % M)) % M;
		}
		d++;
		if(a > 1 && d * d > a)
		{
			d = a;
		}
	}
	fprintf(out, "%llu\n", s);
}