Cod sursa(job #756803)

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

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

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

long long suma(long long a, long long 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,"%lld%lld",&a,&b);
    fclose(f);
    
    if (b != 0)
    {
          long long i=2;
          long long c=0;
          while (i*i <= a)
          {
                i++;
                if (a % i == 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,"%lld\n",sol);
	fclose(g);
	
	return 0;
}