Cod sursa(job #2386597)

Utilizator vladadAndries Vlad Andrei vladad Data 23 martie 2019 11:44:20
Problema Suma divizorilor Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<bits/stdc++.h>
#define ll long long
#define mod 9901
using namespace std;
ifstream f("sumdiv.in");
ofstream g("sumdiv.out");
ll a, b;
struct factor
{
    ll div, exp;
} fact[1000001];
ll t;
bool v[1000001];
ll prim[1000001], nr=1;
void ciur(ll q)
{
    prim[1]=2;
    for(ll i=3; i<=q; i+=2)
    {
        if(v[i]==0)
        {
            for(ll j=2*i; j<=q; j+=i)
                v[j]=1;
            prim[++nr]=i;
        }
    }
}
void desc(ll x)
{
    ciur(x);
    ll nr1=1;
    while(prim[nr1]*prim[nr1]<=x)
    {
        if(x%prim[nr1]==0)
        {
            ll ps=0;
            while(x%prim[nr1]==0)
            {
                x/=prim[nr1];
                ps++;
            }
            fact[++t].div=prim[nr1];
            fact[t].exp=ps;
        }
        nr1++;
    }
}
ll log_pow(ll x, ll p)
{
    ll r=1;
    while(p)
    {
        if((p & 1)) r=(r*x)%mod;
        x=(x*x)%mod;
        p=p>>1;
    }
    return r;
}
ll sum_div(ll x)
{
    desc(x);
    ll s=1;
    for(ll i=1; i<=t; i++)
    {
        s=(s*(((log_pow(fact[i].div, fact[i].exp)))-1)/(fact[i].div-1))%mod;
    }
    return s;
}
int main()
{
    f>>a>>b;
    ll z=log_pow(a, b);
    g<<sum_div(z);
    return 0;
}