Cod sursa(job #3289154)

Utilizator tudordaianDaian Tudor tudordaian Data 25 martie 2025 21:15:47
Problema Suma divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <iostream>
#include <vector>
using namespace std;

typedef long long LL;
const int mod = 9901;

/// vreau sa retin factorul prim si puterea la care apare
vector<int> prime;
vector<int> puteri;
inline void descompune( LL x )
{
    LL cnt;
    for( LL i = 2; i * i <= x; ++i )
        if( x % i  ==  0 )
            {
                prime.push_back( i );
                cnt = 0;
                while( x % i  == 0 )
                    {
                        x = x / i;
                        ++cnt;
                    }
                puteri.push_back( cnt );
            }
    if( x  >  1 ) /// Termin chiar cu un factor prim
        prime.push_back( x ), puteri.push_back( 1 );
}

inline LL exponentiere_rapida( LL A, LL B )
{
    LL rasp = 1;
    while( B != 0 )
        {
            if( B & 1 )
                rasp = (rasp * A) % mod;
            A = (A * A) % mod;
            B = (B >> 1);
        }
    return rasp;
}

/// Atentie, exista supradepasire a tipului de date! De ce esueaza pt valori mari ale lui B?
/// Explicati-va expresiile matematice.

/// Faceti modificarile necesare (CAT MAI PUTINE!) ca sa va dea raspunsul corect!

int main()
{
    freopen("sumdiv.in", "r", stdin);
    freopen("sumdiv.out","w", stdout);
    LL A, B, rasp = 1;
    cout << "A = "; cin >> A;
    cout << "B = "; cin >> B;

    descompune( A );

    int d = prime.size(), i;
    for( i = 0; i < d; ++i )
        {
            puteri[ i ] = B * puteri[ i ];
            if( (prime[i] - 1 ) % mod == 0 )
                rasp = rasp * (puteri[i] + 1) % mod;
            else
                {
                    LL termen1 = ( exponentiere_rapida(prime[i], puteri[i] * B - 1) - 1 ) % mod;
                    LL termen2 = ( prime[ i ] - 1 ) % mod;
                    rasp *= termen1 / termen2;
                    rasp %= mod;
                }
        }

    cout << rasp;

    return 0;
}