Pagini recente » Cod sursa (job #564042) | Cod sursa (job #636076) | Cod sursa (job #1264469) | Cod sursa (job #2837488) | Cod sursa (job #273369)
Cod sursa(job #273369)
# include <stdio.h>
# include <math.h>
# define MAXP 5000
# define MOD 9901
long int a,b,sol;
long int ciur[MAXP+1],ciurlen,fact[MAXP+1],factlen,rep[MAXP+1];
long int prim(long int a)
{
long int i;
for (i=1;i<=ciurlen&&ciur[i]*ciur[i]<=a;i++)
if (a%ciur[i]==0) return 0;
return 1;
}
void make_ciur()
{
ciur[1]=2;
ciurlen=1;
long int i,upper_bound=(long int)sqrt(a)+1;
for (i=3;i<=upper_bound;i+=2)
if (prim(i)) ciur[++ciurlen]=i;
}
void factorizeaza()
{
make_ciur();
long int i;
for (i=1;i<=ciurlen&&a!=1&&ciur[i]*ciur[i]<=a;i++)
if (a%ciur[i]==0)
{
fact[++factlen]=ciur[i];
rep[factlen]=0;
while (a%ciur[i]==0)
{
rep[factlen]++;
a/=ciur[i];
}
}
if (a!=1)
{
fact[++factlen]=a;
rep[factlen]=1;
}
}
void citire()
{
FILE *f=fopen("sumdiv.in","r");
fscanf(f,"%ld%ld",&a,&b);
fclose(f);
}
void scrie()
{
FILE *g=fopen("sumdiv.out","w");
fprintf(g,"%ld\n",sol);
fclose(g);
}
void test_factorizare()
{
long int i;
for (i=1;i<=factlen;i++)
printf("%ld %ld\n",fact[i],rep[i]);
getchar();
}
long int putere(long int base, long int exp)
{
if (exp==0) return 1;
long int part=putere(base, exp/2);
if (exp%2==1) return (((part*part)%MOD)*(base%MOD))%MOD;
return (part*part)%MOD;
}
long int invers(long int a)
{
long int i;
for (i=1;i<=MOD;i++)
if ((i*a)%MOD==1) return i;
return 9900;
}
long int normalizeaza(long int a)
{
while (a<0) a+=MOD;
return a%MOD;
}
long int summod(long int base, long int rep)
{
if (base%MOD==1) return normalizeaza(rep+1);
long int sol= normalizeaza(putere(base,rep+1)-1) * normalizeaza(invers(normalizeaza(base-1)));
return normalizeaza(sol);
}
void calculeaza()
{
long int i;
sol=1;
for (i=1;i<=factlen;i++)
sol=normalizeaza((sol*summod(normalizeaza(fact[i]),rep[i]*b)));
}
int main()
{
citire();
factorizeaza();
calculeaza();
scrie();
return 0;
}