Cod sursa(job #900166)

Utilizator lehman97Dimulescu David lehman97 Data 28 februarie 2013 18:01:49
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 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<16;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)%MOD;
        nr2=(ridic(a-1,MOD-2)%MOD);
        sum=((sum%MOD)*(nr1*nr2)%MOD)%MOD;


    }

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