Cod sursa(job #1409938)

Utilizator SpiriFlaviuBerbecariu Flaviu SpiriFlaviu Data 30 martie 2015 19:40:59
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <iostream>
#include <vector>
#include <set>
#include <queue>
#include <algorithm>
#include <string>
#include <fstream>
#include <cctype>
#include <iomanip>
#include <cmath>
#include <cstring>
#include <map>
#include <bitset>
#include <stack>


using namespace std;

 const int MOD = 9973;

ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

bitset<2000007> prim;

void euclid(int a, int b, long long &x, long long &y)
{
    if(b == 0)
    {
        x = 1;
        y = 0;
        return;
    }
    euclid(b,a%b,x,y);
    long long aux = x;
    x = y;
    y = aux - y*(a/b);
}

int getInverse(int a)
{
    long long x, y;
    euclid(a,MOD,x,y);
    if(x < 0)
        x += MOD;
    return x;
}

void solve()
{
    long long n;
    fin>>n;
    long long nrdiv = 1, sumdiv = 1;
    long long auxn = n;
    for(long long i = 2; i*i <= auxn; i++ )
        if(prim[i] && n%i == 0)
        {
            int x = i;
            int e = 0;
            long long xd = 1;
            while(n%i == 0)
            {
                n /= i;
                xd *= x;
                e ++;
            }
            nrdiv *= (e+1);

            sumdiv *= (xd*x-1)*getInverse(x-1);
            sumdiv %=MOD;
        }
    if(n > 1)
        sumdiv = n+1, nrdiv = 2;
    fout<<nrdiv<<' '<<sumdiv%MOD<<'\n';
}

int main()
{
    //freopen("1.in");
    //freopen("1.out");
    //memset(prim,1,sizeof(prim));
    prim.set();
    prim[0] = prim[1] = false;
    for(int i = 1; i <= 2000000; i ++)
        if(prim[i])
            for(long long j = i*i; j <= 2000000LL; j += i)
            {
                if(j < 0 || j > 2000000)
                    break;
                prim[j] = false;
            }
    int t;
    fin>>t;
    for(int i = 1; i <= t; i++)
        solve();



    return 0;
}


//FILE!!!