Cod sursa(job #1349792)

Utilizator sulzandreiandrei sulzandrei Data 20 februarie 2015 14:52:33
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("ssnd.in");
ofstream out("ssnd.out");
#include <map>
#define dmax 1000001
#define m 9973
#define ull unsigned long long int
//bitset<1000000000000>a;
int d[dmax];
bool v[dmax];
ull rezolvadivx(ull x,ull put)
{
    ull rez=1,bas=x;
    while(put)
    {
        if(put&1)
            rez = ((rez%m)*(bas%m))%m;
        bas = ((bas%m)*(bas%m))%m;
        put>>=1;
    }
    rez--;
    rez = rez/(x-1);
    return rez;
}
int main()
{
    ull n,t,k,i,j;
    in>>t;
    for(i=2;i<dmax;i++)
        v[i]=true;
    for(i=2;i*i<dmax;i++)
        if(v[i])
        for(j=i*i;j<dmax;j+=i)
            v[j]=false;
    for(k=0;k<t;k++)
    {
        in>>n;
    for(i=2;i<dmax;i++)
        d[i]=0;
    ull prod=1,re=n,s=1;
    for(i=2;i<=n;i++)
    {
        if(v[i]==true && n%i==0)
            while(n%i==0)
           {
               d[i]++;
               n/=i;
            }
    }

    if (d[re])
        out<<"2 "<<(re+1)%m<<"\n";
    else
    {

      for(i=2;i<=re;i++)
    if ((v[i]==true) &&(d[i]>0))
            prod = ((prod%m)*((d[i]+1)%m))%m;
        out<<prod<<" ";
        for(i=2;i<=re;i++)
            if (v[i]==true && ((re%i)==0))
                s = ((s%m)*(rezolvadivx(i,d[i]+1)%m))%m;
       out<<s%m<<"\n";
    }

    }
    return 0;
}