Cod sursa(job #1009453)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 13 octombrie 2013 11:18:43
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>
#include <cstring>

#define sqrtmaxn 1000000
#define mod 9973
#define ll long long

using namespace std;

ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

int p[sqrtmaxn],v[sqrtmaxn+1];

ll factors[sqrtmaxn],powers[sqrtmaxn],x,nr,sum;
int pn,t,f;

void erathostenes (int n)
{
    p[1] = 2;
    pn = 1;

    int i;
    for (i=3; i*i<=n; i+=2)
    {
        if (!v[i])
        {
            p[++pn] = i;
            for (int j=i*i; j<=n; j+=i)
            {
                v[j] = 1;
            }
        }
    }

    for (; i<=n; i+=2)
    {
        if (!v[i])
            p[++pn] = i;
    }
}

ll lgpow (ll a, ll b)
{
    if (b==0) return 1;

    ll x = lgpow (a,b/2);

    if (b%2) return x*x%mod*a%mod;
    return x*x%mod;
}

int main()
{

    erathostenes (sqrtmaxn);

    fin>>t;

    for (int i=1; i<=t; ++i)
    {
        fin>>x;

        for (int i=1; i<=pn && x!=1; ++i)
        {
            if (x%p[i]==0)
            {
                ++f;
                factors[f] = p[i];
            }

            while (x%p[i]==0)
            {
                x /= p[i];
                ++powers[f];
            }
        }

        if (x != 1)
        {
            factors[++f] = x;
            powers[f] = 1;
        }

        nr = 1, sum =1;

        for (int i=1; i<=f; ++i)
        {
            nr *= (powers[i]+1);

            sum *= (((lgpow(factors[i],powers[i]+1)-1)%mod)*(lgpow((factors[i]-1)%mod,mod-2))%mod);
        }

        fout<<nr<<" "<<sum<<"\n";

        memset (factors,0,sizeof(factors));
        memset (powers,0,sizeof(powers));
    }
}