Cod sursa(job #1349769)

Utilizator sulzandreiandrei sulzandrei Data 20 februarie 2015 14:32:06
Problema Suma si numarul divizorilor Scor 0
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 <bitset>
#define dmax 1000001
#define m 9973
#define ull unsigned long long int
int v[dmax],i,j;
//bitset<1000000000000>a;
ull d[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;
    in>>t;
    for(i=2;i<dmax;i++)
        v[i]=1;
    for(i=2;i*i<dmax;i++)
        if(v[i])
        for(j=i*i;j<dmax;j+=2*i)
            v[j]=0;
    for(k=0;k<t;k++)
    {
        in>>n;
    for(i=2;i<dmax;i++)
        d[i]=0;
    ull prod=1,re=n;
    for(i=2;i<=n;i++)
    {
        //cout<<i<<" "<<v[i]<<endl;
        if(v[i]==1 &&n%i==0)
            while(n%i==0)
           {
               d[i]++;
               n/=i;
            }
    }
    if (d[re])
        out<<"2 "<<(re+1)%m<<"\n";
    else
    {

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

    }
    return 0;
}