Cod sursa(job #925356)

Utilizator PatrikStepan Patrik Patrik Data 24 martie 2013 14:05:48
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include<cstdio>
#include<vector>
using namespace std;
#define MAX 2500001
#define pb push_back
#define MOD 9901
int A , B  , s , pu;
vector<int> p;
bool v[MAX];

void ciur();
int pow(int a, long long  b);

int main()
{
    s = 1;
    ciur();
    freopen("sumdiv.in" , "r" , stdin );
    scanf("%d%d" , &A , &B );
    for( int j = 0 ; j < (int)p.size() && p[j]*p[j] <= A ; ++j )
    {
        pu = 0;
        while(A%p[j]==0)
        {
            A/=p[j];
            pu++;
        }
        if(pu)
        s = (1ll*s*(pow(p[j],pu*B+1)-1)/(p[j]-1))%MOD;
    }
    if(A>1)s = (1ll*s*(pow(A,B+1)-1)/(A-1))%MOD;
    freopen("sumdiv.out" , "w" , stdout );
    printf("%d" , s);
    return 0;
}

void ciur()
{
    p.pb(2);
    for(int i = 3 ; i <= MAX ; i+=2)
    {
        if(v[i])continue;
        p.pb(i);
        for(int j = i*i ; j <= MAX && j > 0; j+=(i<<1))
            v[j] = 1;
    }
}

int pow (int a , long long b)
{
    int rez = 1 , nr = a;
    for(int i = 0 ; (1<<i) <= b ; ++i)
    {
        if((1<<i)&b)
            rez = (1ll*rez*nr)%MOD;
        nr = (1ll*nr*nr)%MOD;
    }
    return rez;
}