Cod sursa(job #2277064)

Utilizator maria_sinteaMaria Sintea maria_sintea Data 5 noiembrie 2018 19:28:26
Problema Suma si numarul divizorilor Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.26 kb
#include <iostream>
#include <cstdio>
#define mod 9973
#define N 1000005

using namespace std;

long long ciur[N];
int n, t, s, nr;

void eratostene()
{
    for(int d=2;d<=N;d++)
        if(!ciur[d])
            for(int i=2;i*d<=N;i++)
                ciur[i*d]=1;
}

void inv_modular(int a, int b, int &l, int &k)
{
    if(b==0)
    {
        l=1;
        k=0;
        return;
    }
    int k1, l1;
    inv_modular(b, a%b, l1, k1);
    l=k1;
    k=l1-(a/b)*k1;
}

int putere(int a, int p)
{
    int prod=1;
    while(p>0)
    {
        if(p%2==0)
        {
            a=(1LL*a*a)%mod;
            p=p/2;
        }
        else
        {
            p--;
            prod=(prod*1LL*a)%mod;
        }
    }
    return prod;
}

int main()
{
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);

    eratostene();
    scanf("%d\n", &t);
    for(int test=0;test<t;test++)
    {
        scanf("%d\n", &n);
        s=1; nr=1;
        int p=0;
        while(n%2==0)
        {
            n=n/2;
            p++;
        }
        if(p>0)
        {
            nr=(1LL*nr*(p+1))%mod;
            s=(1LL*putere(2, p+1))%mod-1;
        }
        for(int i=3;i*i<=n;i+=2)
            if(!ciur[i])
            {
                p=0;
                while(n%i==0)
                {
                    n=n/i;
                    p++;
                }
                if(p>0)
                {
                    nr=(1LL*nr*(p+1))%mod;
                    int nc=(putere(i, p+1)%mod)-1;
                    int l, k;
                    inv_modular(i-1, mod, l, k);
                    while(l<0)
                        l+=mod;
                    if(l!=0)
                        s=(1LL*s*(1LL*nc*l)%mod)%mod;
                    else
                        s=(1LL*s*nc)%mod;
                }
            }
        if(n>1)
        {
            nr=nr*2;
            int nc=(1LL*n*n)%mod-1;
            int l, k;
            inv_modular(n-1, mod, l, k);
            while(l<0)
                l+=mod;
            if(l!=0)
                s=(1LL*s*(1LL*nc*l)%mod)%mod;
            else
                s=(1LL*s*nc)%mod;
        }
        printf("%d %d\n", nr, s);
    }
    return 0;
}