Cod sursa(job #2001527)

Utilizator VarticeanNicolae Varticean Varticean Data 16 iulie 2017 23:55:56
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#define ll long long
#define M 1000009
using namespace std;
ifstream in("ssnd.in");
ofstream out("ssnd.out");
ll prim[M],k;
ll pow(ll x,ll m)
{
    ll p=1;
    while (m>0)
    {
    if(m%2)
    {
        p=(p*x)%9973;
        m--;
    }
        x=(x*x)%9973;
        m/=2;
    }
    return p;
}
void ciur()
{
 bool a[M];
 for( int i=2; i<=M; i++)
      a[i]=1;
     for(int i=2; i<=M; i++)
        {
        if(a[i])
        for(int j=2*i; j<=M; j+=i )
          a[j]=0;
          if( i*i>M ) break;
        }

     for(int i=2; i<=M; i++)
        if(a[i]) prim[++k]=i;
}
int main()
{
    ciur();
    ll n,x;
    in>>n;
    for(;n;n--)
    {
        ll sum=1, nr=1, i=1;
        in>>x;
        while(x>0 &&  prim[i]*prim[i]*1LL<=x)
        {
            ll exp=0;
            if(x%prim[i]==0)
            {
               while(x%prim[i]==0 )
                {
                 exp++;
                 x/=prim[i];
                }
                 nr*=(exp+1);
              sum=( (sum*(pow(prim[i],exp+1)-1))%9973*pow(prim[i]-1,9971))%9973;
            }
            i++;
        }
        if(x>1) {
                 nr*=(1+1);
              sum=(1LL*sum*(x+1) % 9973);
        }
        out<<nr<<' '<<sum<<'\n';
    }


    return 0;
}