Cod sursa(job #756794)

Utilizator Darth_NiculusIvan Nicolae Darth_Niculus Data 10 iunie 2012 14:25:49
Problema Suma divizorilor Scor 0
Compilator cpp Status done
Runda Remember Mihai Pătrașcu Marime 1.17 kb
#include <stdio.h>

int a,b,sol=1,modulo=9901;

int power(int x,int y)
{
	int r=1;
	x%=modulo;
	while (y)
	{       
		if(y&1)
			r=(r*x)%modulo;
		x=(x*x)%modulo;
		
        y>>=1;
	}
	return r;
}

int suma(int a, int b)
{
	if (b==1)
		return a%modulo;
	if (b&1)
		return (suma(a,b-1)+power(a,b))%modulo;
		
	return ((power(a,b>>1)+1)*suma(a,b>>1))%modulo;
}

int main ()
{
    FILE* f = fopen("sumadiv.in","r");
    fscanf(f,"%d%d",&a,&b);
    fclose(f);
    
    if (b != 0)
    {
          int i=2;
          while (i*i <= a)
          {
                i++;
                if (a % i == 0)
                {
                      int c=0;
                      while (a % i == 0)
                      {
                            c++;
                            a=a/i;
                      }
                      
                      sol=(sol*(suma(i,c*b)+1)%modulo)%modulo;
                }
          }
          
          if (a > 1)
          {
                sol=(sol*(suma(a,b)+1)%modulo)%modulo;
          }
    }
    
	FILE* g  = fopen("sumadiv.out","w");
	fprintf(g,"%d\n",sol);
	fclose(g);
	
	return 0;
}