Cod sursa(job #2045397)

Utilizator valentinoMoldovan Rares valentino Data 22 octombrie 2017 12:46:57
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <bitset>
#include <time.h>
#include <iomanip>
#define MOD 9973
#define NM 1000005
using namespace std;

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

long long n;
bitset < NM > viz;
int d[80000], k, t;

void ciur()
{
    for(int i = 2; i <= NM; ++i)
    {
        if(!viz[i])
        {
            d[++k] = i;
            for(int j = i + i; j <= NM; j += i)
                viz[j] = 1;
        }
    }
}

inline int pow(int n, int p)
{
    int res = 1;
    n = n % MOD;
    while(p)
    {
        if(p & 1) res = (res * n) % MOD;
        n = (n * n) % MOD;
        p >>= 1;
    }
    return res;
}

int main()
{
    clock_t start, finish;
    start = clock();
    ciur();
    f >> t;
    for(int i = 1; i <= t; ++i)
    {
        int sum = 1, nrd = 1;
        f >> n;
        for(int j = 1; j <= k && 1LL * d[j] * d[j] <= n; ++j)
        {
            if(n % d[j]) continue;

            int p = 0;
            while(n % d[j] == 0)
            {
                p++;
                n /= d[j];
            }

            nrd *= (p + 1);

            int p1 = ( pow(d[j], p + 1) - 1) % MOD;
            int p2 =  pow(d[j] - 1, MOD - 2) % MOD;

            sum = (((sum * p1) % MOD) * p2) % MOD;
        }
        if(n != 1)
        {
            nrd *= 2;
            sum = (1LL * sum * (n + 1)) % MOD;
        }
        g << nrd << ' ' << sum << '\n';

    }
    finish = clock();
}