Cod sursa(job #2571758)

Utilizator butnaru_vlad2003Butnaru Vlad butnaru_vlad2003 Data 5 martie 2020 10:02:10
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <fstream>
#define int long long
#define mod 9973
using namespace std;
int n,k;
ifstream in ("ssnd.in");
ofstream out ("ssnd.out");
int exp (int n, int k)
{
    int ans = 1;
    while (k)
    {
        if (k&1)
            ans = (ans * n) % mod;
        k>>=1;
        n = (n * n) % mod;
    }
    return ans % mod;
}
int nrdiv (int k)
{
    int p = 1;
    for (int d = 2;d * d <=k;++d)
    {
        int s = 0;
        while (k%d==0)
            s++,k/=d;
        p*=s+1;
    }
    if (k!=1)
        p *= 2;
    return p;
}
int sumdiv (int k)
{
    int ans = 1;
    for (int i = 2;i*i<=k;++i)
    {
        int s = 0;
        while (k%i==0)
            s++,k/=i;
        if (s)
            ans = (ans * (exp(i,s+1)-1) / (i-1)) % mod;
    }
    if (k!=1)
        ans = (ans * (exp(k,2)-1) / (k-1)) % mod;
    return ans % mod;
}
main()
{
    in>>n;
    for (int i = 1;i<=n;++i)
    {
        in>>k;
        out<<nrdiv(k)<<' ';
        out<<sumdiv(k)<<'\n';
    }
    return 0;
}