Cod sursa(job #1753888)

Utilizator tanasaradutanasaradu tanasaradu Data 7 septembrie 2016 11:52:29
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <bits/stdc++.h>
#define infinit 9973
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
int teste;
int a[1000005],prime[100005],k;
void Ciur()
{
    int i,j;
    a[1]=0;
    for(i=4;i<=1000000;i=i+2)
        a[i]=1;
    for(i=3;i*i<=1000000;i=i+2)
        if(a[i]==0)
            for(j=i*i;j<=1000000;j=j+(2*i))
                    a[j]=1;
    prime[1]=2;
    k=1;
    for(i=3;i<=1000000;i=i+2)
        if(a[i]==0)
          prime[++k]=i;
}
int Putere(long long x,long long  y)
{
    long long  prod=1;
      while(y>0)
      {
          if(y%2==1)
          {
              prod=(1LL*prod*x)%infinit;
              y--;
          }
          x=(1LL*x*x)%infinit;
          y=y/2;
      }
      return prod;
}
void Descompunere(long long p)
{
    int d=prime[1],i=1;
    long long nrdivizori,sumadivizori,s;
    nrdivizori=sumadivizori=1;
     while(p>1 and d*d<=p and i<k)
     {
         s=0;
         while(p%d==0)
         {
             s++;
             p=p/d;
         }
         if(s>0)
         {
             nrdivizori=(nrdivizori*(s+1));
              sumadivizori=(1LL*(Putere(d,s+1)-1)/(d-1)*sumadivizori)%infinit;
         }
         i++;
         d=prime[i];
     }
     if(p>1)
     {
         nrdivizori=nrdivizori*2;
         sumadivizori=(1LL*sumadivizori*(Putere(p,2)-1)/(p-1))%infinit;
     }
     fout<<nrdivizori<<" "<<sumadivizori%infinit<<"\n";
}
int main()
{
    int i;
    long long x;
    Ciur();
    fin>>teste;
    for(i=1;i<=teste;i++)
    {
        fin>>x;
        Descompunere(x);
    }
    return 0;
}