Cod sursa(job #2039151)

Utilizator maria_sinteaMaria Sintea maria_sintea Data 14 octombrie 2017 11:59:43
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <cstdio>
#define mod 9973
#define N 1000000

using namespace std;

long long int n, nr, s, x, sc;

pair<long long, long long> euclidext(long long a, long long b)
{
    if(b==0)
        return {1,0};
    auto p=euclidext(b, a%b);
    return {p.second, p.first-(a/b)*p.second};
}

long long exp(long long a, long long p)
{
    if(p==0)
        return 1;
    if(p%2==0)
        return exp((a*a)%mod, p/2);
    return (exp(a, p-1)*a)%mod;
}

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

    scanf("%d\n", &n);
    for(int i=0;i<n;i++)
    {
        scanf("%d\n", &x);
        nr=1;
        s=1;
        int p=0;
        while(x%2==0)
        {
            x=x/2;
            p++;
        }
        if(p>0)
        {
            nr=(nr*(p+1))%mod;
            sc=exp(2, p+1)-1;
            s=(s*sc)%mod;
        }

        int d=3;
        while(x>1)
        {
            p=0;
            while(x%d==0)
            {
                p++;
                x=x/d;
            }
            if(p>0)
            {
                nr=(1LL*nr*(p+1))%mod;
                pair<long long, long long> rez=euclidext(d-1, mod);
                while(rez.first<0)
                    rez.first+=mod;
                sc=(1LL*(exp(d, p+1)-1)*rez.first)%mod;
                s=(s*sc)%mod;
            }
            d+=2;
        }
        printf("%lld %lld\n", nr, s);
    }
    return 0;
}