Cod sursa(job #3166625)

Utilizator davidgeo123Georgescu David davidgeo123 Data 9 noiembrie 2023 09:52:15
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <bits/stdc++.h>

using namespace std;

#define int long long

const int MAXN=1e6+5;
int ciur[MAXN+5];
long long prime[MAXN], k=0;

void make_ciur()
{
    ciur[0]=ciur[1]=1;
    for(int i=1; i*i<=MAXN; i++)
        if(ciur[i]==0)
        {
            prime[++k]=i;
            for(int j=i*i; j<=MAXN; j+=i)
                ciur[j]=1;
        }

}
const int MOD=9973;

int putere(int baza, int exp)
{
    int rez=1;
    while(exp)
    {
        if(exp&1)
            rez=rez*baza %MOD;
        baza=baza*baza%MOD;
        exp>>=1;
    }
    return rez;
}
int inversmodular(int x)
{
    return putere(x, MOD-2)%MOD;
}
signed main()
{
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);
    make_ciur();
    int n;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        int x;
        cin>>x;
        int nrdiv=1;
        int sumdiv=1;
        for(int pos=1; pos<=k && x; pos++)
        {
            if(x%prime[pos]!=0)///nu se imparte
                continue;
            int cnt=0;
            while(x%prime[pos]==0)
            {
                cnt++;
                x/=prime[pos];
            }
            nrdiv*=(cnt+1);
            nrdiv%=MOD;
            int numarator=putere(prime[pos], cnt+1)-1;
            int numitor=inversmodular((prime[pos]-1)%MOD);
            sumdiv*=((numarator%MOD) * (numitor%MOD))%MOD;
        }
        if(x > 1) {
            nrdiv *= 2;
            sumdiv = (1LL*sumdiv*(x+1) % MOD);
        }
        cout<<nrdiv<<' '<<sumdiv<<'\n';
    }
    return 0;
}