Cod sursa(job #2270729)

Utilizator giotoPopescu Ioan gioto Data 27 octombrie 2018 14:43:28
Problema Suma si numarul divizorilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>
using namespace std;

int t;
const int MOD = 9973;
struct fp{
    int x, k;
};
fp p[1005];
int invmod[10005];
inline void desc(long long x, int &NR){
    for(int i = 2; 1LL * i * i <= x ; ++i){
        if(x % i == 0){
            p[++NR] = {i, 0};
            while(x % i == 0){
                ++p[NR].k;
                x /= i;
            }
        }
    }
    if(x > 1) p[++NR] = {x, 1};
}
inline int lgput(int x, int p){
    int ans = 1, aux = x;
    for(int i = 1; i <= p ; i *= 2){
        if(i & p) ans = (1LL * ans * aux) % MOD;
        aux = (1LL * aux * aux) % MOD;
    }
    return ans;
}
int main()
{
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);

    scanf("%d", &t);
    long long n;
    for(int i = 1; i <= 9973 ; ++i)
        invmod[i] = lgput(i, MOD - 2);
    while(t--){
        scanf("%lld", &n);
        int NR = 0;
        desc(n, NR);

        int nrdiv = 1, sumdiv = 1;
        for(int i = 1; i <= NR ; ++i){
            nrdiv = nrdiv * (p[i].k + 1);
            sumdiv = (1LL * sumdiv * (lgput(p[i].x, p[i].k + 1) - 1) * invmod[p[i].x - 1]) % MOD;
            if(sumdiv < 0) sumdiv = sumdiv % MOD + MOD;
        }
        printf("%d %d\n", nrdiv, sumdiv);
    }

    return 0;
}