Cod sursa(job #1999253)

Utilizator CodrinsahCotarlan Codrin Codrinsah Data 10 iulie 2017 18:47:27
Problema Invers modular Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <cmath>
#define P 9973

using namespace std;
ifstream fi ("ssnd.in");
ofstream fo ("ssnd.out");

struct structura{int el,nr;} divizor[100006];
int T,numar,i,j,nrprime,nrdiv;
int prim[100006],fr[100006];

void precalculare()
{
  for (i=2;i<=100000;i++)
    if (!fr[i])
    {
      for (j=i+i;j<=100000;j=j+i) fr[j]=1;
      nrprime++;
      prim[nrprime]=i;
    }
}

int putere(int baza,int exponent)
{
  baza=baza%P;
  if (exponent==1) return baza%P;
  if (exponent%2==0) return putere(baza*baza,exponent/2)%P;
  if (exponent%2==1) return baza*putere(baza,exponent-1)%P;
}

void aflare_nrdiv(int x)
{
  int iprim;
  int sol=1;
  nrdiv=0;
  for (iprim=1;prim[iprim]<=sqrt(x+.01);iprim++)
  if (x%prim[iprim]==0)
  {
    nrdiv++;
    divizor[nrdiv].el=prim[iprim];
    int cnt=0;
    while (x%prim[iprim]==0)
    {
      x=x/prim[iprim];
      cnt++;
    }
    divizor[nrdiv].nr=cnt;
    sol=sol*(cnt+1);
  }
  if (x>1)
  {
    nrdiv++;
    divizor[nrdiv].el=x;
    divizor[nrdiv].nr=1;
    sol=sol*2;
  }
  fo<<sol<<' ';
}

void aflare_sumdiv()
{
  int sol=1;
  for (i=1;i<=nrdiv;i++)
  {
    int numarator=putere(divizor[i].el,divizor[i].nr+1)-1;
    int invmod=putere(divizor[i].el-1,P-2);
    sol=sol*numarator*invmod;
    sol=sol%P;
  }
  fo<<sol<<'\n';
}
int main()
{
    precalculare();
    fi>>T;
    while (T)
    {
      T--;
      fi>>numar;
      aflare_nrdiv(numar);
      aflare_sumdiv();
    }
    return 0;
}