Cod sursa(job #2039138)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 14 octombrie 2017 11:47:13
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <iostream>
#include <cstdio>
#define MOD 9973

using namespace std;
long long n,x;
long long s,nd,lp;
pair <long long, long long> r;
int putere(int p)
{
    int r=0;
    while(n%p==0)
    {
        n/=p;
        r++;
    }
    return r;
}
pair <long long, long long> euclid(long long la, long long lb)
{
    if(lb==0)
    return {1,0};
    auto p=euclid(lb,la%lb);
    return {p.second,p.first-p.second*(la/lb)};
}
int invers(int ln)
{
    r=euclid(ln,MOD);
    while(r.first<0)
        r.first+=MOD;
    return r.first;
}
int ridicare(int b, int p)
{
    int r=1;
    while(p)
    {
        if(p%2==0)
        {
            b=(b*b)%MOD;
            p/=2;
        }
        else
        {
            r=(r*b)%MOD;
            p--;
            b=(b*b)%MOD;
            p/=2;
        }
    }
    return r;
}
void solve()
{
    if(n%2==0)
    {
        lp=putere(2);
        nd=(nd*(lp+1))%MOD;
        s=((s*(ridicare(2,lp+1)-1)))%MOD;
    }
    if(n%3==0)
    {
        lp=putere(3);
        nd=(nd*(lp+1))%MOD;
        s=((s*(ridicare(3,lp+1)-1))*(invers(2)))%MOD;
    }
    for(int i=5;i*i<=n;i+=6)
    {
        if(n%i==0)
        {
            lp=putere(i);
            nd=(nd*(lp+1))%MOD;
            s=((s*(ridicare(i,lp+1)-1))*(invers(i-1)))%MOD;
        }
        if(n%(i+2)==0)
        {
            lp=putere(i+2);
            nd=(nd*(lp+1))%MOD;
            s=((s*(ridicare(i+2,lp+1)-1))*(invers(i+1)))%MOD;
        }
    }
    if(n!=1)
    {
        nd=(nd*2)%MOD;
        s=((s*(n*n-1))*(invers(n-1)))%MOD;
    }
    cout<<nd<<" "<<s<<"\n";
}
int main()
{
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    scanf("%d", &x);
    for(int i=0;i<x;i++)
    {
        scanf("\n%d", &n);
        s=nd=1;
        solve();
    }
    return 0;
}