Cod sursa(job #3255252)

Utilizator mariusharabariMarius Harabari mariusharabari Data 9 noiembrie 2024 20:06:50
Problema Suma divizorilor Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <bits/stdc++.h>
using namespace std;

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

const int NMAX=7100;
const int MOD=9901;

int s=1, a, b, i, j, k=1;
int p[NMAX], viz[NMAX];

void ciur(){
    for(i=2;i<=NMAX;i++){
        if(viz[i]==0){
            p[k]=i;
            k++;

            for(j=i*2;j<=NMAX;j+=i) viz[j]=1;
        }
    }
}

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

int invMod(int a, int n){
    int x, y;
    euclid(a, n, x, y);
    while(x<0) x+=n;
    return x;
}

int lgput(int a,int p){
    if(p==0) return 1;
    if(p%2==0) return lgput((a%MOD)*(a%MOD)%MOD, p/2)%MOD;
    else return (a%MOD)*(lgput((a%MOD)*(a%MOD)%MOD, p/2)%MOD)%MOD;
}

int main(){
    ciur();
    fin>>a>>b;
    for(i=1;p[i]<=a;i++){
        int d=0;
        while(a%p[i]==0){
            a/=p[i];
            d++;
        }
        s*=(lgput(p[i], d*b+1)-1)*invMod(p[i]-1, MOD)%MOD;
        s=s%MOD;
    }
    if(a==1)
        fout<<s;
    else{
        s*=(lgput(a, b+1)-1)*invMod(a-1, MOD)%MOD;
        fout<<s;
    }
    return 0;
}