Cod sursa(job #3121726)

Utilizator Raul_AArdelean Raul Raul_A Data 14 aprilie 2023 22:52:44
Problema Suma divizorilor Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <bits/stdc++.h>
#define cin in
#define cout out
#define ll long long
#define MOD 9901
using namespace std;

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

ll a,b,rez=1,d=3,p,X,Y;

ll expr(ll a,ll b) 
{
    if(b==0) return 1;
    else
    {
        ll p=expr(a,b/2);
        if(b%2==0)
            return p*p%MOD;
        else
            return p*p%MOD*a%MOD;
    }
}

void invmod(ll a,ll b,ll& x,ll& y) 
{
    if(b==0) x=y=1;
    else
    {
        ll x1,y1;
        invmod(b,a%b,x1,y1);
        x=y1;
        y=x1-a/b*y1;
    }
}

int sum_div(int n)
{
    int s=0;
    for(int d=1;d*d<=n;++d)
    {
        if(n%d==0){
            s+=d;
            s+=n/d;
        }
        if(d*d==n)
            s-=d;
    }
    return s%MOD;
} 

int main()
{
    cin>>a>>b;
    
    a%=MOD;
    //cout<<sum_div(a)<<'\n';
    
    if(a==0)
    {
        cout<<0;
        return 0;
    }
    
    while(a%2==0)
        a/=2,p++;
     
    if(p)
    {
        rez=rez*(expr(2,p*b+1)%MOD+MOD-1)%MOD;
        invmod(1,MOD,X,Y);
        
        if(X<0) X+=MOD;
        
        rez=rez*X%MOD;
    }
    
    while(d*d<=a)
    {
        p=0;
        while(a%d==0)
            a/=d,p++;
        
        if(p)
        {
            rez=rez*(expr(d,p*b+1)%MOD+MOD-1)%MOD;
            invmod(d-1,MOD,X,Y);
            
            if(X<0) X+=MOD;
            
            rez=rez*X%MOD;
        }
        d+=2;
    }
    
    if(a>1)
    {
        rez=rez*(expr(a,b+1)%MOD+MOD-1)%MOD;
        invmod(a-1,MOD,X,Y);
        
        if(X<0) X+=MOD;
        
        rez=rez*X%MOD;
    }
    
    cout<<rez;
    return 0;
}