Cod sursa(job #1009456)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 13 octombrie 2013 11:29:30
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 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[100000],v[sqrtmaxn];

int x,nr,sum;
int pn,t,f,po;

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;
    }
}

int lgpow (int a, int 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;

        sum =1 , nr = 1;

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

            po=0;

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

            nr *= (po+1);

            int f1 = (lgpow(f,po+1)-1)%mod;
            int f2 = (lgpow(f-1,mod-2));

            sum *= (f1*f2%mod);
        }

        if (x != 1)
        {
            nr *= 2;

            int f1 = (lgpow(x,2)-1)%mod;
            int f2 = (lgpow(x-1,mod-2));

            sum *= (f1*f2%mod);
        }

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