Cod sursa(job #2667244)

Utilizator andrei_ciobanuciobanu andrei andrei_ciobanu Data 3 noiembrie 2020 10:41:51
Problema Suma divizorilor Scor 20
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.46 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;
        }
        if (put == 0) continue;
        put *= b;
        put ++;
        int s;
        if (x % MOD == 1){
            s = put % MOD;
        }else{
            s = lgput(x, put) - 1;
            if (s < 0) s += MOD;
            s = (long long)(s * lgput(x - 1, MOD - 2));
        }
        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;
        if (x % MOD == 1){
            s = put % MOD;
        }else{
            s = lgput(x, put) - 1;
            if (s < 0) s += MOD;
            s = (long long)(s * lgput(x - 1, MOD - 2));
        }
        sum_div = (long long)(sum_div * s) % MOD;
    }
    fprintf(fout, "%d", sum_div);
    return 0;
}