Cod sursa(job #3163718)

Utilizator comanandreiComan Andrei comanandrei Data 31 octombrie 2023 23:10:03
Problema Suma divizorilor Scor 20
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <stdio.h>

#define MAXFACTPRIM 7071
#define MOD 9901

char ciur[MAXFACTPRIM+1];

int exp_rapid(int a, int b){
    int p=1;
    while(b){
        if(b%2==1){
            p=p*a%MOD;
        }
        a=a*a%MOD;
        b/=2;
    }
    return p;
}

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

int main()
{
    FILE *fin, *fout;
    int a, b, index, index2, d, numarator, numitor, nr, x, y, cmmdc;
    for(index=2;index*index<=MAXFACTPRIM;index++){
        if(ciur[index]==0){
            for(index2=index*index;index2<=MAXFACTPRIM;index2+=index){
                ciur[index2]=1;
            }
        }
    }
    fin=fopen("sumdiv.in", "r");
    fscanf(fin, "%d%d", &a, &b);
    fclose(fin);
    ///numarator=produs de p^(e+1)-1
    ///numitor=produs de p-1
    ///p-factor prim
    d=2;
    numarator=1;
    numitor=1;
    while(d*d<=a){
        if(ciur[d]==0&&a%d==0){
            nr=1;
            while(a%d==0){
                nr=nr*d%MOD;
                a/=d;
            }
            nr=(d*exp_rapid(nr, b)-1+MOD)%MOD;
            numarator=numarator*nr%MOD;
            numitor=numitor*(d-1);
        }
        d++;
    }
    if(a>1){
        nr=a;
        nr=(nr%MOD*exp_rapid(nr, b)-1+MOD)%MOD;
        numarator=numarator*nr%MOD;
        numitor=numitor*((a-1)%MOD);
    }
    fout=fopen("sumdiv.out", "w");
    invmod(numitor, MOD, &cmmdc, &x, &y);
    fprintf(fout, "%d", numarator*x%MOD);
    fclose(fout);
    return 0;
}