Cod sursa(job #2565303)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 2 martie 2020 13:32:54
Problema Suma divizorilor Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin( "sumdiv.in" );
ofstream fout( "sumdiv.out" );

const int MOD = 9901;

int A, B;
vector <int> primes;

int Exp( long long v, int p ) {
    if( p == 1 ) return v % MOD;

    int ans = Exp( v, p / 2 );

    ans = ( 1LL * ans * ans ) % MOD;
    if( p % 2 ) ans = ( 1LL * ans * v ) % MOD;

    return ans;
}

int InvMod( int val ) {
    return Exp( val, MOD - 2 );
}

void Do()
{
    long long sum = 1;

    for( int i = 2; i * i <= A; ++i ) {
       long long ex = 0;

       while( A % i == 0 ) {
         ++ex;
         A /= i;
       }

       if( ex == 0 ) continue;

       ex = ex * B;
       long long prod = Exp( i, ex + 1 ) - 1;

       if( prod < 0 ) prod += MOD;
       prod = ( 1LL * prod * InvMod( i - 1 ) ) % MOD;

       sum = ( 1LL * sum * prod ) % MOD;
    }

    if( A ) {
      //fout << A << '\n';

      long long prod = Exp( A, B + 1 ) - 1;

      if( prod < 0 ) prod += MOD;
      prod = ( 1LL * prod * InvMod( A - 1 ) ) % MOD;

      sum = ( 1LL * sum * prod ) % MOD;
    }

    fout << sum << '\n';
}

int main()
{
    fin >> A >> B;

    Do();

    return 0;
}