Cod sursa(job #1111818)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 19 februarie 2014 09:57:57
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <algorithm>
#include <bitset>
#include <cmath>
#include <ctime>
#define mod 9973
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");

int t, prim[80000], nr, lim, prod;
long long sum, X;
bitset < 1000005 > viz;

void ciur()
{
    prim[++nr]=2;
    for (int i=3; i<=1000000; i+=2)
        if (!viz[i])
        {
            prim[++nr]=i;
            if(i<=1000)
            for (int j=i*i; j<=1000000; j+=i)
                viz[j]=1;
        }
}

long long log_pow(long long baza, long long exp)
{
    long long res=1;
    while (exp>0)
    {
        if (exp%2) res=(res*res) % mod;
        baza=(baza*baza) % mod;  exp/=2;
    }
    return res;
}

int main()
{
    f>>t; ciur();
    for (int ii=1; ii<=t; ++ii)
    {
        f>>X; lim=sqrt(X)+1; prod=sum=1;
        for (int i=1; i<=nr && prim[i]*prim[i]<=X && X>1; ++i)
            if (X%prim[i]==0)
            {
                int k=0;
                while (X%prim[i]==0) ++k, X/=prim[i];
                prod*=(k+1);
                int x1=(log_pow(prim[i], k+1)-1) % mod,
                x2=log_pow(prim[i]-1, mod-2);
                sum=(sum*x1*x2) % mod;
            }
        if (X>1) prod*=2, sum=(sum*(X+1))%mod;
        g<<prod<<' '<<sum<<'\n';
    }
    return 0;
}