Cod sursa(job #623895)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 20 octombrie 2011 21:44:22
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.71 kb
#include <cstdio>
#define mod 9901

int a, b, sol, v[1000], p[1000], k;

int pow(int x, int n)
{
	int r=1;
	x%=mod;
	for (; n>0; n>>=1)
	{
		if (n&1) r=(r*x)%mod;
		x=(x*x)%mod;
	}
	return r;
}

int main()
{
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);
	scanf("%d %d", &a, &b);
	int i, d, c;
	for (d=2; d*d<=a; d++)
	{
		c=0;
		while (!(a%d))
		{
			c++;
			a/=d;
		}
		if (c)
		{
			k++;
			v[k]=d;
			p[k]=c*b;
		}
	}
	if (a>1) 
	{
		v[++k]=a;
		p[k]=b;
	}
	sol=1;
	for (i=1; i<=k; i++)
	{
		if (v[i]%mod==1)
			sol=sol*((p[i]+1)%mod)%mod; else
			sol=(sol*(pow(v[i], p[i]+1)-1+mod)%mod*pow(v[i]-1, mod-2))%mod;
	}
	if (!a) sol=0;
	printf("%d",sol);
}