Cod sursa(job #2094311)

Utilizator robertro1Benedek Robert George robertro1 Data 25 decembrie 2017 17:26:37
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <fstream>
using namespace std;
typedef  long long ll;
int p[1000001],a[1000001],b[1000001],s,ss;
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)
{
    if(n%2==0) while(n%2==0) {n/=2; b[2]++;}
    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]++;
                }
            }
        }

    }

}

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;
        if(p[n]==0) s= 2;
    else{

  //cout<<b[2]<<endl;
    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(p[n]==0){ss=n+1; 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';


   }
    return 0;
}