Cod sursa(job #3323066)

Utilizator MateiDiaconuDiaconu Matei Stefan MateiDiaconu Data 16 noiembrie 2025 20:48:34
Problema Suma divizorilor Scor 40
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <stdio.h>
#include <stdlib.h>

#define MOD 9901


void euler(int a, int b, int *x, int *y){
    if(b == 0){
        *x = 1;
        *y = 0;
    }
    else{
        int x0, y0;
        euler(b, a % b, &x0, &y0);
        *x = y0;
        *y = x0 - (a / b) * y0;
    }
}

int main()
{
    FILE *fin, *fout;
    fin = fopen("sumdiv.in", "r");
    fout = fopen("sumdiv.out", "w");

    int a, b, d, e, sum, p, nr, x, y;

    fscanf(fin, "%d%d", &a, &b);

    sum = 1;
    d = 2;
    while(d * d <= a){
        e = 0;
        while(a % d == 0){
            a /= d;
            e++;
        }
        // calculam d ^ (e * b + 1) % MOD
        e = e * b + 1;
        p = 1;
        nr = d;
        while(e > 0){
            if(e % 2 == 1){
                p = (p * nr) % MOD;
            }
            nr = (nr * nr) % MOD;
            e /= 2;
        }
        // calculam invMod
        euler(d - 1, MOD, &x, &y);
        if(x < 0){
            x += MOD;
        }
        p--;
        sum *= (p * x) % MOD;
        d++;
    }
    if(a > 1){
        // apare a ^ b
        e = b + 1;
        p = 1;
        nr = a;
        while(e > 0){
            if(e % 2 == 1){
                p = (p * nr) % MOD;
            }
            nr = (nr * nr) % MOD;
            e /= 2;
        }
        euler(a - 1, MOD, &x, &y);
        if(x < 0){
            x += MOD;
        }
        p--;
        sum *= (p * x) % MOD;
    }

    fprintf(fout, "%d", sum);

    fclose(fin);
    fclose(fout);
    return 0;
}