Cod sursa(job #900087)

Utilizator lehman97Dimulescu David lehman97 Data 28 februarie 2013 17:35:54
Problema Suma divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <iostream>
#include <stdio.h>
#include <cmath>
#define MOD 9901



using namespace std;


FILE *f=fopen("sumdiv.in","r");
FILE *g=fopen("sumdiv.out","w");


bool prim[10001];
int v[10001],i,j,a,b,nr,pt[10001];
unsigned long long nr1,nr2,sum;

unsigned long long ridic(int a, int b)
{
    unsigned long long cn,nr,m,i;
    cn=a;
    nr=1;
    for(i=0;i<=32;i++)
    {
        m=1<<i;
        if((m&b)==m)
        nr=(cn*nr)%MOD;
        cn=(cn*cn)%MOD;
    }
    return nr;
}


void ciur()
{
    int i,j;
    for(i=2;i<=10000;i++)
    if(!prim[i])
    {
        v[++v[0]]=i;
        for(j=i*i;j<=10000;j+=i)
        prim[j]=1;
    }
}



int main()
{
    fscanf(f,"%d",&a);
    fscanf(f,"%d",&b);
    i=1;
    sum=1;
    ciur();
    while(sqrt(a)>=v[i])
    {
        while(a%v[i]==0){pt[i]++;a/=v[i];}
        i++;
    }
    if(a>1)
    {
        nr1=ridic(a,b+1)-1;
        nr2=ridic(a-1,MOD-2);
        sum=(long long)(nr1*nr2)%MOD;
    }

    for(i=1;i<=v[0];i++)
    {
        if(pt[i])
        {
            nr1=ridic(v[i],pt[i]*b+1)-1;
            nr2=ridic(v[i]-1,MOD-2);
            sum*=(long long)(nr1*nr2)%MOD;
        }
    }
    fprintf(g,"%d",sum);
    fclose(g);
    return 0;
}