Cod sursa(job #2094402)

Utilizator robertro1Benedek Robert George robertro1 Data 25 decembrie 2017 19:49:48
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <fstream>
using namespace std;
typedef unsigned long long ll;
int p[1000001],a[1000001],b[1000001],s,ss,rep=0;
ll exp(int n,int m)
{
   if(m==1) return n%9973;
   if(m%2==0) return (exp(n,m/2)%9973)*(exp(n,m/2)%9973);
   if(m%2==1) return ((exp(n,m/2)%9973)*(exp(n,m/2)%9973)*n)%9973;

}
void prim(ll n)
{
    p[1]=1;
    for(int i=4; i<=n; i+=2)
        p[i]=1;
    for(int i=3; i<=n; i+=2)
    {
        if(p[i]==0)
        for(int j=2; j*i<=n; ++j)
            p[i*j]=1;
    }


}
void fact(ll n)
{
    rep=0;
    if(n%2==0) while(n%2==0) {n/=2; b[2]++;rep++;}
    for(int i=3; i<=n; i+=2)
    {
        if(p[i]==0)
        {
            if(n%i==0)
            {
                while(n%i==0)
                {
                    n=n/i;
                    b[i]++;
                    rep++;
                }
            }
        }

    }
}

int main()
{
    ll n,t;
    ifstream f("ssnd.in");
    ofstream g("ssnd.out");
    f>>t;
    prim(1000000);
    //fact(12);

   // g<<nrdiv(12)<< " " <<sdiv(12);
   //cout<< sdiv(12);
   for(int i=1; i<=t;++i)
   {
       f>>n;
       fact(n);
       s=1;ss=1;


  //cout<<b[2]<<endl;
  if(rep==1) s=2;
  else
    {if(b[2]>0) s=s*(b[2]+1);
    for(int i=3; i*i<=n;i+=2)
    {
        if(b[i]>0) s*=(b[i]+1);




    }
    }
    if(rep==1) {ss=n+1;if(n<1000001)b[n]=0;}
    else{
    if(n%2==0) ss=ss*(exp(2,b[2]+1)-1)%9973; b[2]=0;
    for(int i=3; i*i<=n; i+=2)
    {
        if(b[i]>0)
       {

        ss=(ss*((exp(i,b[i]+1)-1)%9973)/(i-1) )%9973;
        b[i]=0;
       }
    }

}
       g<<s<<" "<<ss<<'\n';


   }
  // cout<<b[2]<<" "<<b[13];
    return 0;
}