Cod sursa(job #2050135)

Utilizator razvanradulescuRadulescu Razvan razvanradulescu Data 27 octombrie 2017 23:02:10
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <iostream>
#include <fstream>
#define MOD 9973
using namespace std;

bool a[1000500];
long long int prim[100000];
long long int n, m;
int nrdiv = 1, s = 1;

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

void fciur()
{
    int k = 0;
    for (int i=2;i*i<=1000000;i++)
        if (a[i] == 0)
            for (int j=i;j<=1000000/i;j++)
                a[i*j]=1;
    for (int i=2;i<=1000000;i++)
        if (a[i] == 0)
        {
            prim[k] = i;
            k++;
        }
    prim[k] == m*2;
}

void put(long long int pr, long long int p, long long int &rez)
{
    if(p == 0)
        return;
    if(p % 2 != 0)
    {
        rez = (pr*rez) % MOD;
        p--;
    }
    else
    {
        p /= 2;
        pr = (pr*pr) % MOD;
    }
    put(pr,p,rez);
}

void inversmodular(int a, int b, int &x, int &y)
{
    if(!b)
    {
        x = 1;
        y = 0;
        return;
    }
    int x1, y1;
    inversmodular(b, a%b, x1, y1);
    x = y1;
    y = x1 - a/b * y1;
}

void div()
{
    int e;
    int aux;
    for(int j = 0; j<n; j++)
    {
        f>>m;
        aux = m;
        for(int i = 0; prim[i] <= m; i++)
        {
            e = 0;
            while(aux%prim[i]==0)
            {
                aux/=prim[i];
                e++;
            }
            if(e!=0)
            {
                int invmod = 0, l = 0;
                long long int rez = 1;
                put(prim[i], e + 1, rez);
                inversmodular(prim[i] - 1, MOD, invmod, l);
                while(invmod < 0)
                    invmod+=MOD;
                s *= (((rez - 1) % MOD) * invmod) % MOD;
            }
            nrdiv = nrdiv * (1+e);
        }
        g<<nrdiv<<" "<<s<<"\n";
        nrdiv = 1;
        s = 1;
    }
}


int main()
{
    f>>n;
    fciur();
    div();
    return 0;
}