Cod sursa(job #1861251)

Utilizator Andrei_Gamerul9112Madarasan Andrei Andrei_Gamerul9112 Data 28 ianuarie 2017 18:49:35
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
# include <fstream>
# include <bitset>
# define mod 9973
using namespace std;
ifstream f ("ssnd.in");
ofstream g ("ssnd.out");
long long int n;
long long int a[1000000],q,w,sd,pd,k,i,p,t,j,m=1000100;
bool v[1000210];

  void ciur ()
  {
      long long int j,i;

      for (i=2;i<=m;i=i++)
          if (v[i]==0)
          {
              k++;
              a[k]=i;
              for (j=i*i;j<=m;j=j+i)
                  v[j]=1;
          }
  }

  inline int putere (long long int a,long long int b)
  {
      if (b==1)
          return a;
      else
          if (b%2==0)
             {
                long long int x=putere (a,b/2);
                 return (x*x)%mod;
             }
          else
              return a*putere (a,b-1)%mod;
  }

int main ()
{
    ciur ();
    f>>t;

    for (;t>=1;t--)
    {
        f>>n;
        sd=1;
        pd=1;
        for (j=1;j<=k && a[j]*a[j]<=n;j++)
        {

            i=a[j];

            if (n%i==0)
            {
                p=0;
                while (n%i==0)
                {
                    n=n/i;
                    p++;
                    if (j==1)
                        m=0;
                }

            sd=sd*(p+1);

            q=(putere (i,p+1)%mod)-1;
            w=(putere ((i-1),mod-2))%mod;
            if (q<0)
                q+=mod;
            pd=(pd*((q*w)%mod))%mod;

            }
        }
        if (n!=1)
        {
            p=1;
            i=n;
            sd=sd*(p+1);

            q=(putere (i,p+1)-1)%mod;
            w=(putere ((i-1),mod-2))%mod;
            if (q<0)
                q+=mod;
            pd=(pd*((q*w)%mod))%mod;
        }

        g<<sd<<" "<<pd<<"\n";
    }

    return 0;
}