Cod sursa(job #2663815)

Utilizator AlexNicuNicu Alexandru AlexNicu Data 27 octombrie 2020 13:17:55
Problema Suma divizorilor Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <cstdio>

using namespace std;
ifstream cin ( "sumdiv.in" );
ofstream cout ( "sumdiv.out" );
#define MOD 9901
int main()
{
    unsigned long long a, b, d, ans, p, n, ans1;
    cin >> a >> b;
    d = 2;
    ans = 1;
    while ( d * d <= a ) {
       p = 0;
       while ( a % d == 0 ) {
          p++;
          a /= d;
       }
       if ( p > 0 ) {
       n = p * b + 1;
       p = d;
       ans1 = 1;
       while ( n > 0 ) {
         if ( n % 2 == 1 )
          ans1 = ans1 * ( p % MOD ) % MOD;
         p =  ( p % MOD ) * ( p % MOD ) % MOD;
         n /= 2;
       }
       if ( ans1 > 0 )
        ans = ans * ( ans1 - 1 ) % MOD;
       else
        ans = ans * 9900 % MOD;
       n = MOD - 2;
       p = d - 1;
       while ( n > 0 ) {
         if ( n % 2 == 1 )
          ans = ans * ( p % MOD ) % MOD;
         p =  ( p % MOD ) * ( p % MOD ) % MOD;
         n /= 2;
       }
       }
       d++;
    }
    if ( a > 1 ) {
       n = b + 1;
       p = a;
       ans1 = 1;
       while ( n > 0 ) {
         if ( n % 2 == 1 )
          ans1 = ans1 * ( p % MOD ) % MOD;
         p =  ( p % MOD ) * ( p % MOD ) % MOD;
         n /= 2;
       }
       if ( ans1 > 0 )
        ans = ans * ( ans1 - 1 ) % MOD;
       else
        ans = ans * 9900 % MOD;
       n = MOD - 2;
       p = a - 1;
       while ( n > 0 ) {
         if ( n % 2 == 1 )
          ans = ans * ( p % MOD ) % MOD;
         p =  ( p % MOD ) * ( p % MOD ) % MOD;
         n /= 2;
       }
    }
    if ( a > 0 )
    cout << ans;
    else
      cout << "0";
    return 0;
}