Cod sursa(job #496362)

Utilizator nightwish0031Vlad Radu Cristian nightwish0031 Data 28 octombrie 2010 17:49:14
Problema Suma divizorilor Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<cstdio>

const int MOD=9901;
int B;
const int N=1<<20;

void fisiere()
{
    freopen("sumdiv.in","r",stdin);
    freopen("sumdiv.out","w",stdout);
}
 
int np;
int exp[30000],div[30000];
void descomp(int a)
{
   int d=2,e;
   
    while (d*d<=a)
    {
        if (a%d)
       {
		   ++d;  
		   continue;
        }
        
       e=0;
        while (a%d==0)
        {
           ++e;
           a/=d;
        }
       
	   exp[++np]=e;
       div[np]=d;
       ++d;
   }
     
    if (a!=1)
   {
       exp[++np]=1;
      div[np]=a;
   }
}

void citeste()
{
    int A;
    fisiere();
    scanf("%d%d",&A,&B);
   descomp(A);
}

int put(int p,int e)
{
    if (e==0) return 1;
    if (e%2==0)
       return put((p*p)%MOD,e/2)%MOD;
    return p*put((p*p)%MOD,e/2)%MOD;
}

int inv[30000];
void inverse()
{
    int i;
    inv[1]=1;
    for (i=2;i<MOD;++i)
        if (inv[i]==0)
        {
           inv[i]=put(i,MOD-2);
           inv[inv[i]]=i;
       }
}
 
void rezolva()
{
	int s=1,i;
	for (i=1;i<=np;++i)
        exp[i]=exp[i]*B;
	for (i=1;i<=np;++i)
        if (div[i]%MOD-1!=0)
            
       {
           s*=(put(div[i],exp[i]+1)+MOD-1)%MOD;
		   s*=inv[(div[i]+MOD-1)%MOD]%MOD;
       }
         else
           s*=(exp[i]+1)%MOD;
    printf("%d",s);
}

int main()
{
    citeste();
    inverse();
    rezolva();
   return 0;
}