Cod sursa(job #918325)

Utilizator lehman97Dimulescu David lehman97 Data 18 martie 2013 20:02:55
Problema Suma divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <bitset>
#define M 9901
using namespace std;

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

int v[10050],i,j,a,b,nr,put[10050];
bitset<10006>prim;
unsigned long long sum,prod,prod2;
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;
    }
}
unsigned long long ridic(unsigned long long  n, unsigned long long  p)
{
    int m,i,nr=1,cn=n;
    for(i=0;(1<<i)<=p;i++)
    {
        if((1<<i)&p)nr=(nr*cn)%M;
        cn=(cn*cn)%M;
    }
    return nr;
}
int main()
{
    fscanf(f,"%d%d",&a,&b);
    b%=(M-1);
    sum=1;
    ciur();
    i=1;
    while(sqrt(a)>=v[i])
    {
        while(a%v[i]==0){put[i]++;a/=v[i];}
        i++;
    }
    if(a>1)
    {
        prod=(ridic(a,b+1)-1)%M;
        prod2=(ridic(a-1,M-2)%M);
        sum=((sum%M)*(prod* prod2)%M)%M;
    }
    for(i=1;i<=v[0];i++)
    {
        if(put[i])
        {
            prod=(ridic(v[i],put[i]*b+1)-1)%M;
            prod2=(ridic(v[i]-1,M-2))%M;
            sum=((sum%M)*(prod*prod2)%M)%M;
        }
    }
    if(a==0)sum=0;
    fprintf(g,"%d",sum);
    fclose(g);
    return 0;
}