Cod sursa(job #2667245)

Utilizator andrei_ciobanuciobanu andrei andrei_ciobanu Data 3 noiembrie 2020 10:42:50
Problema Suma divizorilor Scor 50
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.5 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){
            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;
}