Cod sursa(job #2194656)

Utilizator PushkinPetolea Cosmin Pushkin Data 14 aprilie 2018 00:03:08
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include <fstream>
#include <bits/stdc++.h>
#include <cmath>
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
#define pb push_back
#define ullong unsigned long long
vector<bool> b;
vector<ullong> p;
vector<ullong> v;
ullong pwr(ullong n, ullong p)
{
    ullong x=1;
    for(ullong i=0;(1<<i)<=p;i++)
    {
        if(p&(1<<i))
            x*=n;
        n*=n;
    }
    return x;
}
void ciur(ullong n)
{
    ullong x=2, i;
    b.resize(n, 0);
    while(x<=n)
    {
        p.pb(x);
        for(i=x;i<=n;i+=x)b[i]=1;
        while(b[++x]&&x<=n);
    }
}
pair<ullong, ullong> fact_prim(ullong n)
{
    ullong i=0, cn=n;
    while(p[i]<=sqrt(cn))
    {
        v[i]=0;
        while(!(n%p[i]))
        {
            v[i]++;
            n/=p[i];
        }
        i++;
    }
    return make_pair(n, i);
}
int main()
{
    ciur(1e+6);
    ullong n, i, cn;
    pair<ullong, ullong> pa;
    f>>n;
    v.resize(1000003);
    while(f>>n)
    {
        pa=fact_prim(n);
        cn=pa.first;
        n=1;
        for(i=0;i<pa.second;i++)if(v[i])
        {
            n*=(v[i]+1);
            n%=9973;
        }
        if(cn>1)
        {
            n*=2;
            n%=9973;
        }
        g<<n<<' ';
        n=1;
        for(i=0;i<pa.second;i++)if(v[i])
        {
            n*=(pwr(p[i], v[i]+1)-1)/(p[i]-1);
            n%=9973;
        }
        if(cn>1)
        {
            n*=(pwr(cn, 2)-1)/(cn-1);
            n%=9973;
        }
        g<<n<<'\n';
        ///v.clear();
    }
    f.close();
    g.close();
    return 0;
}