Cod sursa(job #3134846)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 31 mai 2023 15:13:44
Problema Suma divizorilor Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.99 kb
//Ilie Dumitru
#include<cstdio>
const int NMAX=60;
const int MOD=9901;

int cnt, fact[NMAX], ex[NMAX];

int fastExp(int x, int y)
{
	if(y==0)
		return 1;
	if(y==1)
		return x;
	int a=fastExp(x, y>>1);
	a=a*a%MOD;
	if(y&1)
		a=a*x%MOD;
	return a;
}

void factorizare(int n)
{
	int i;
	if(!(n&1))
	{
		cnt=1;
		*fact=2;
		do
			++*ex, n>>=1;
		while(!(n&1));
	}
	for(i=3;i*i<=n;i+=2)
		if(n%i==0)
		{
			fact[cnt]=i;
			do
			{
				n/=i;
				++ex[cnt];
			}while(n%i==0);
			++cnt;
		}
	if(n>1)
	{
		fact[cnt]=n;
		ex[cnt++]=1;
	}
}

int main()
{
	FILE* f=fopen("sumdiv.in", "r"), *g=fopen("sumdiv.out", "w");
	//FILE* f=stdin, *g=stdout;
	int n, p, ans, i;

	fscanf(f, "%d%d", &n, &p);
	if(n<2)
		fprintf(g, "%d\n", n);
	else
	{
		ans=1;
		factorizare(n);
		for(i=0;i<cnt;++i)
			ans=ans*(fastExp(fact[i]%MOD, (p*ex[i]+1)%(MOD-1))-1+MOD)%MOD*fastExp((fact[i]-1)%MOD, MOD-2)%MOD;
		fprintf(g, "%d", ans);
	}

	fclose(f);
	fclose(g);
	return 0;
}