Cod sursa(job #2683084)

Utilizator Xutzu358Ignat Alex Xutzu358 Data 10 decembrie 2020 14:04:17
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.13 kb
#include <bits/stdc++.h>
#define nmax 1000006
#define ll long long
using namespace std;


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

bitset < nmax > isprime;
ll primes[100005];
int nrprimes;
ll mod = 9973;
ll n,fact,sumdiv,nrdiv,invmod;
ll t,px,dx;
ll a,b,x,y;

void correct_modular() {
    if (x<1) {
        int need = x-1;
        need = -need;
        if (need%mod==0) {
            x += need;
        }
        else {
            need /= mod;
            need++;
            x += need*mod;
        }
    }
}

int invers_modular(ll a,ll b) {
    if (b!=0) {
        invers_modular(b,a%b);
    }
    if (b==0) {
        x = 1;
        y = 0;
    }
    else {
        ll aux = x;
        x = y;
        y = aux - (a/b)*y;
    }
}

void ciur() {
    for (ll i=2;i<=nmax;i++) {
        if (isprime[i]==0) {
            for (ll j=i*i;j<=nmax;j+=i) {
                isprime[j] = 1;
            }
            primes[++nrprimes]=i;
        }
    }
}

void calculate_fact() {
    fact = px%mod;
    while (n%px==0) {
        n/=px;
        dx++;
        fact = (fact*px)%mod;
    }
    fact--;
    if (fact==-1) {
        fact += mod;
    }
}

int main()
{
    ciur();
    f >> t;
    for (ll o=1;o<=t;o++) {
        f >> n;
        nrdiv = 1;
        sumdiv = 1;
        for (ll k=1;primes[k]*primes[k]<=n;k++) {
            px = primes[k];
            dx = 0;
            if (n%px==0) {
                calculate_fact();
                invers_modular(px-1,mod);
                correct_modular();
                invmod = x;
                sumdiv = (((sumdiv%mod)*(invmod%mod)%mod)*(fact%mod))%mod;
                nrdiv *= (dx+1);
            }
        }
        if (n!=1) {
            fact = ((n%mod)*(n%mod))%mod;
            fact--;
            if (fact==-1) {
                fact += mod;
            }
            invers_modular(n-1,mod);
            correct_modular();
            invmod = x;
            sumdiv = (((sumdiv%mod)*(invmod%mod)%mod)*(fact%mod))%mod;
            nrdiv *= 2;
        }
        g << nrdiv << " " << sumdiv << '\n';
    }
    return 0;
}