Cod sursa(job #1009477)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 13 octombrie 2013 11:59:52
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 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];
bool v[sqrtmaxn];

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

long long x;

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 && 1LL*p[i]*p[i]<=x; ++i)
        {
            if (x%p[i]!=0)
                continue;

            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 = sum*f1%mod*f2%mod;
        }

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

            ll left = ((x*x-1)/(x-1))%mod;
            sum = sum * left %mod;
        }

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