Cod sursa(job #2389051)

Utilizator Cezar211Popoveniuc Cezar Cezar211 Data 26 martie 2019 19:30:21
Problema Suma si numarul divizorilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>
#define ll long long
#define MOD 9973
#define NM 1000005
using namespace std;
ifstream fin ("ssnd.in");
ofstream fout ("ssnd.out");
int t;
bitset<NM> c;
vector<int> v;
ll putere(ll a, int b)///a^b
{
    int p = 1;
    while(b)
    {
        if(b%2 == 1)
            p = (p*a)%MOD;
        a = (a*a)%MOD;
        b/=2;
    }
    return p;
}
void ciur()
{
    c[0] = c[1] = 1;
    for(int j=4; j<NM; j+=2)
        c[j] = 1;
    for(int i=3; i*i<NM; i+=2)
        if(c[i] == 0)
            for(int j=i*i; j<NM; j+=2*i)
                c[j] = 1;
    v.push_back(2);
    for(int i=3; i<NM; i+=2)
        if(!c[i])
            v.push_back(i);
}
void solve(int x)
{
    int k = 0, nr_div = 1, suma = 1;
    while(v[k]*v[k]<=x)
    {
        if(x%v[k] == 0)
        {
            int p = 0;
            while(x%v[k] == 0)
            {
                p++;
                x/=v[k];
            }
            nr_div*=(p+1);
            suma = (suma* (putere(v[k], p+1)-1))%MOD;
            suma = (suma* putere(v[k]-1, MOD-2))%MOD;
        }
        k++;
    }
    if(x > 1)
    {
        nr_div*=2;
        suma = (suma* (putere(x, 2)-1))%MOD;
        suma = (suma* putere(x-1, MOD-2))%MOD;
    }
    fout << nr_div << ' ' << suma << '\n';
}
int main()
{
    fin >> t;
    ciur();
    while(t--)
    {
        int x;
        fin >> x;
        solve(x);
    }
    return 0;
}