Cod sursa(job #2667233)

Utilizator andrei_ciobanuciobanu andrei andrei_ciobanu Data 3 noiembrie 2020 10:14:36
Problema Suma divizorilor Scor 50
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <stdio.h>
#include <stdlib.h>

#define MOD 9901

int lgput(int n, int p){
    int put = 1;
    while (p > 0){
        if (p % 2 == 1){
            put = (long long)(put * n) % MOD;
        }
        n = (long long)(n * n) % MOD;
        p /= 2;
    }
    return put;
}

int main()
{
    FILE *fin, *fout;
    fin = fopen("sumdiv.in", "r");
    fout = fopen("sumdiv.out", "w");
    int a, b;
    fscanf(fin, "%d%d", &a, &b);
    int x = 2, sum_div = 1;
    while (x * x <= a){
        int put = 0;
        while (a % x == 0){
            put ++;
            a /= x;
        }
        put *= b;
        put ++;
        int s = lgput(x, put) - 1;
        if (s < 0) s += MOD;
        s = (long long)(s * lgput(x - 1, MOD - 2)) % MOD;
        sum_div = (long long)(sum_div * s) % MOD;
        x ++;
    }
    if (a > 1){
        x = a;
        int put = 0;
        while (a % x == 0){
            put ++;
            a /= x;
        }
        put *= b;
        put ++;
        int s = lgput(x, put) - 1;
        if (s < 0) s += MOD;
        s = (s * lgput(x - 1, MOD - 2));
        sum_div = (sum_div * s) % MOD;
    }
    fprintf(fout, "%d", sum_div);
    return 0;
}