Cod sursa(job #2277110)

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

using namespace std;

long long ciur[N];
long long n, t, s, nr;
vector <long long> prime;

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

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

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

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

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