Cod sursa(job #254807)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 7 februarie 2009 17:03:17
Problema Suma divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>
#define NR 9901
int e[30000],r=0;
long long a,b,suma=1;
void citire()
{
	scanf("%lld%lld",&a,&b);
	b=b;
}
int euler(int n)
{
	int i=1,rez=n; 
	for (i=2; i*i<=n; i++)
	{
		if (n%i==0)
		{
			while(n%i==0)
				n/=i;
			rez=rez/i*(i-1);
		}
	}
	if (n!=1)
		rez=rez/n*(n-1);
	return rez;
}
long long putere(int a,int b,int c)
{
	long long s=1;
	while(b)  
    { 
		if (b%2)
			s=s*a%c;
		a=(long long)a*a%c;  
		b/=2;  
	}  
	return s;
}
void precalcul()
{
	int i,t;
	t=euler(NR)-1;
	for (i=1; i<=30000; i++)
		e[++r]=putere(i,t,NR)%NR;
}
int power(long long n,long long p)
{
	long long s=1;
	n=n%NR;   
    while(p)   
    {   
        if (p%2)   
            s=s*n%NR;   
        n=n*n%NR;   
        p/=2;   
    }  	
	return s;
}
void rezolvare()
{
	long long i,exp;
	if (b==0)
	{
		printf("1");
		return ;
	}
	if (a==NR)
	{
		printf("1");
		return;
	}
	for (i=2; i*i<=a; i++)
	{
		if (a%i==0)
		{
			exp=0;
			while (a%i==0)
			{
				a/=i;
				exp++;
			}
			suma*=(power(i,exp*b+1)-1)/e[i-1]%NR;
		}
	}
	if (a!=1)
		suma*=(power(a,b+1)-1)/(a-1)%NR;
	printf("%lld",suma%NR);
}	
int main()
{
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);
	citire();
	precalcul();
	rezolvare();
	//printf("%lld",suma%NR);
	return 0;
}