Cod sursa(job #1366444)

Utilizator sulzandreiandrei sulzandrei Data 1 martie 2015 01:49:30
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <fstream>
#include <bitset>
using namespace std;
ifstream in("ssnd.in");
ofstream out("ssnd.out");
#define dim 1000001
#define mod 9973
#define ull unsigned long long int
bitset<dim> v;
ull n,i,j,t,cop,Ndiv,Sdiv,tes,dp=0,p,d;
ull divp[1000002];
void Sieve()
{

    for(i=2;i<dim;i++)
        if(v[i]==0)
        {
            divp[dp++]=i;
            for(j=i*i;j<dim;j+=i)
                v[j]=1;
        }
}
ull put(ull base,ull k)
{
    p = base;
    ull res=1;
    while(k)
    {
        if(k&1)
            res *=base;
        base *=base;
        k>>=1;
    }
    return ((((res-1)%mod)/((p-1)%mod))%mod);
}
void calcul()
{
    Sdiv = Ndiv = 1;
    cop = n;
    for(i=0;i<dp && divp[i]*divp[i]<=cop;i++)
        if ((n%divp[i]==0))
        {
            d = 1;
            while(n%divp[i]==0)
            {
                n /=divp[i];
                d++;
            }
            Ndiv *=d;
            Sdiv =((Sdiv%mod)*put(divp[i],d))%mod;
        }
    if(n>1)
    {
        Sdiv = (cop+1)%mod;
        Ndiv = 2;
    }
}
int main()
{
    in>>t;
    Sieve();
    for(tes=0;tes<t;tes++)
    {
        in>>n;
        calcul();
        out<<Ndiv<<" "<<Sdiv<<endl;
    }
    return 0;
}