Cod sursa(job #876835)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 12 februarie 2013 10:50:33
Problema Suma divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <iostream>
#include <fstream>
#include <bitset>

using namespace std;

#define Nmax 10001
#define modulo 9901

unsigned long long div[Nmax];
char ciur[1<<18];
unsigned long long A, B, res = 1, l, A1;

void gen(){

    div[++l] = 2;

    for(unsigned long long i = 3; i < Nmax; i += 2){

        if(ciur[i >> 4] & (1 << ((i >> 1) & 7)))
            continue;

        div[++l] = i;

        for(unsigned long long j = i + (i << 1); j < Nmax; j += (i << 1))
            ciur[j >> 4] |= ( 1 << ((j >> 1) & 7) ) ;
    }
}

inline unsigned long long putere(unsigned long long a, unsigned long long b){

    unsigned long long result = 1;

    a %= modulo;

    for(unsigned long long i = 0; (1 << i) <= b; i++){

        if( (1 << i) & b )
            result = (result * a) % modulo;

        a = (a * a) % modulo;
    }

    return result;
}

unsigned long long prog(unsigned long long a, unsigned long long b){

    if( a % modulo == 1)
        return b * B + 1;
    else
        return ( putere ( a, b * B + 1 ) + modulo - 1 ) * ( putere ( a - 1, modulo - 2) ) % modulo;
}

void citire(){

    ifstream f("sumdiv.in");

    f >> A >> B;
    A1 = A;

    f.close();
}

void rezolva(){

    for(unsigned long long i = 1, p = 0; div[i] * div[i] <= A; i++)
        if(A % div[i])
            continue;

        else{
                for(p = 0 ; A1 % div[i] == 0 ; A1 /= div[i], p++);

                if(p)
                    res = ( res * 1LL * prog ( div[i], p ) ) % modulo;
            }

     if(A1)
        res = ( res * 1LL * prog ( A1, 1 ) ) % modulo;
}

void afis(){

    ofstream g("sumdiv.out");

    g << res << "\n";

    g.close();
}


int main(){

    citire();
    gen();
    rezolva();
    afis();

    return 0;
}