Cod sursa(job #2669419)

Utilizator Remus.RughinisRemus Rughinis Remus.Rughinis Data 6 noiembrie 2020 21:45:58
Problema Suma divizorilor Scor 60
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <stdio.h>
#include <stdlib.h>
#define MAX 7071
#define MOD 9901

int exprap(int a, int b){
  int s=1;
  while(b>0){
    if(b%2==1){
      s*=a;
      s%=MOD;
    }
    a*=a;
    a%=MOD;
    b/=2;
  }
  return s;
}
int invmod(int x){
  int a=exprap(x,MOD-2);
  while(x<0)
    x+=MOD;
}

int ciur[MAX+1],prime[5],divprimi[5][2];
int main(){
  FILE *fin, *fout;
  int a, b, d, i, iprime, idprime, s;
  fin=fopen("sumdiv.in","r");
  fscanf(fin,"%d%d",&a,&b);
  fclose(fin);

  iprime=0;
  for(d=2;d<=MAX;d++){ ///Facem ciurul
    if(ciur[d]==0){
      for(i=d*d;i<=MAX;i+=d)
        ciur[i]=1;
      prime[iprime]=d;
      iprime++;
    }
  }

  idprime=0;
  for(i=0;i<iprime;i++){ ///Calculam descompunerea in factori primi al lui a
    if(a%prime[i]==0){
      divprimi[idprime][0]=prime[i];
      while(a%prime[i]==0){
        divprimi[idprime][1]++;
        a/=prime[i];
      }
      idprime++;
    }
  }
  if(a>1){
    divprimi[idprime][0]=a;
    divprimi[idprime][1]=1;
    idprime++;
  }

  s=1;
  for(i=0;i<idprime;i++){
    s*=(exprap(divprimi[i][0],divprimi[i][1]*b+1)-1);
    s%=MOD;
    s*=exprap(divprimi[i][0]-1,MOD-2);///Inversul modular al lui divprimi[i][0]-1
  //  s/=divprimi[i][0]-1;
    s%=MOD;
  }
  fout=fopen("sumdiv.out","w");
  fprintf(fout,"%d\n",s);
  fclose(fout);
  return 0;
}