Cod sursa(job #2046985)

Utilizator LucaSeriSeritan Luca LucaSeri Data 24 octombrie 2017 13:18:39
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <bits/stdc++.h>

using namespace std;

vector<int> ciurulet;
bool viz[1000010];
const int fi = 9972;
const int mod = 9973;

ifstream f("ssnd.in");
ofstream g("ssnd.out");

void build(){
    for(int i = 2; i <= 1000001; ++i){
        if(!viz[i]){
            ciurulet.push_back(i);
            for(int j = i; j <= 1000001; j += i){
                viz[j] = true;
            }
        }
    }
}

int put(int a, int b){
    int ans = 1;
    while(b){
        if(b % 2 == 0){
            a = a * a % mod;
            b /= 2;
        }
        else{
            ans = ans*a%mod;
            --b;
        }
    }

    return ans;
}

int main(){
    int t;
    f >> t;
    build();
    while(t--){
        long long n;
        f >> n;
        long long nr = 1;
        long long sum = 1;
        for(int i = 0; i < ciurulet.size() && 1LL*ciurulet[i]*ciurulet[i] <= n; ++i){
            if(n % ciurulet[i]) continue;
            int p = 0;
            while(n % ciurulet[i] == 0){
                n /= ciurulet[i];
                ++p;
            }
            nr = nr * (p+1) % mod;
            int p1 = (put(ciurulet[i], p+1) - 1) % mod;
            int p2 = put(ciurulet[i]-1, fi-1) % mod;
            sum = (((1LL*sum*p1)%mod)*p2)%mod;
        }

        if(n != 1){
            nr *= 2;
            nr %= mod;
            sum = (1LL*sum*(n+1)%mod);
        }

        g << nr << ' ' << sum <<  '\n';
    }
    return 0;
}