Cod sursa(job #394103)

Utilizator AndreyPAndrei Poenaru AndreyP Data 10 februarie 2010 16:04:17
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include<stdio.h>
#include<stdlib.h>
#define M 9901
int a,b;
int np;
int p[10];
int e[10];
int rez;
inline int put(int b,int e)
{
	int r=1;
	b%=M;
	for(; e>0; e>>=1)
	{
		if((e&1)==1)
			r=(r*b)%M;
		b=(b*b)%M;
	}
	return r;
}
inline int afla(int b,int e)
{
	b%=M;
	if(b==1)
		return e+1;
	if(b==0)
		return 1;
        int aux=put(b,e+1);
	if(aux==0)
		aux=M-1;
	else
		--aux;
	return (aux*put(b-1,M-2))%M;
}
int main()
{
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);

	scanf("%d%d",&a,&b);
	if(a==0)
		exit(4);
	if(b==0)
	{
		printf("1\n");
		return 0;
	}
        if((a&1)==0)
	{
		np=1;
		p[0]=2;
		while((a&1)==0)
		{
			a>>=1;
			++e[0];
		}
		e[0]*=b;
	}
        for(int i=3; i*i<=a; i+=2)
	{
		if(a%i==0)
		{
			p[np]=i;
			while(a%i==0)
			{
				++e[np];
				a/=i;
			}
			e[np]*=b;
			++np;
		}
	}
	if(a!=1)
	{
		p[np]=a;
		e[np]=b;
		++np;
	}
	rez=1;
	for(int i=0; i<np; ++i)
		rez=(rez*afla(p[i],e[i]))%M;
	printf("%d\n",rez);
	
	return 0;
}