Cod sursa(job #1876897)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 12 februarie 2017 18:38:05
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <cstdio>
#define LL long long
#define Nmax 1000000
#define MOD 9973
using namespace std;

ofstream g("ssnd.out");

int v[Nmax+2],nrp;
LL n;

void ciur()
{
    for (LL i=2;i<=Nmax;i++)
    {
        if (v[i]==0)
        {
            v[++nrp] = i;
            for (LL j=i*i;j<=Nmax;j+=i)
                v[j] = 1;
        }
    }
}

int put(LL a,int b)
{
    if (b==1)
        return a%MOD;
    else if (b%2==1)
        return (put((a*a)%MOD,b/2) * a)%MOD;
    else
        return put((a*a)%MOD,b/2);
}

int main()
{
    freopen("ssnd.in","r",stdin);
    int t;
    scanf("%d",&t);

    ciur();

    while (t--)
    {
        scanf("%lld",&n);
        int nr=1,s=1,c;
        for (int j=1;j<=nrp;j++)
        {
            c=0;
            while (n%v[j]==0)
            {
                n/=v[j];
                c++;
            }
            nr=nr*(c+1);
            if (c!=0)
                s = (s *((put(v[j],c+1) - 1 + MOD) % MOD * put(v[j]-1,MOD-2)) )% MOD;
        }
        if (n!=1)
        {
            nr=nr*2;
            s = ((s * put(n,2) - 1 + MOD) % MOD * put(n-1,MOD-2) )% MOD;
        }
        g<<nr<<' '<<s<<'\n';
    }

    return 0;
}