Cod sursa(job #273369)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 8 martie 2009 14:59:23
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
# 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;
}