Cod sursa(job #2278284)

Utilizator victorv88Veltan Victor victorv88 Data 7 noiembrie 2018 16:07:20
Problema Suma si numarul divizorilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 kb
#include <iostream>
#include <fstream>
#include <vector>
#define mod 9973
using namespace std;

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

vector<int>prime;


int n, x, numar,inm, suma=1;
bool ciur[1000005];

///s=1*(2^n-1)/2-1

void ciur_fct()
{
    ciur[0]=1;
    ciur[1]=1;
    for (int i=2; i<=1000000; i++)
    {
        if (!ciur[i])
        {
            prime.push_back(i);
            int mult=2*i;
            while (mult<=1000000)
                ciur[mult]=1,mult+=i;
        }
    }
}

int ridicare_putere(int x, int nr)
{
    int st=1, dr=x;
    while (nr)
    {
        if (nr%2==0)
        {
            dr=dr*dr;
            dr%=mod;
            nr/=2;
        }
        else
        {
            st*=dr;
            st%=mod;
            nr--;
        }
    }
    return st;
}

void invers_mod(int a, int b, int &k, int &l)
{
    if (b==0)
    {
        k=1;
        l=0;
        return;
    }
    int kp, lp;
    invers_mod(b,a%b,kp,lp);
    k=lp;
    l=kp-lp*(a/b);

}

int prog_geom(int x, int nr)
{
    int sus=ridicare_putere(x,nr)-1;
    if (sus<0)
        sus+=mod;
    int jos=(x-1)%mod;
    if (jos<0)
        jos+=mod;
    int k, p;
    if (jos==0)
        return nr%mod;
    invers_mod(jos,mod, k, p);
    if (k<0)
        k+=mod;
    return (sus*k)%mod;
}

int numar_div(int val)
{
    numar=1;
    int lungime=prime.size();
    for (int i=0; i<lungime; i++)
    {
        if (i>val)
            break;
        inm=0;
        while (val%prime[i]==0)
        {
            val/=prime[i];
            inm++;
        }
        if (inm)
        {
            suma=suma*prog_geom(prime[i],inm+1);
            suma%=mod;
        }
        numar*=(inm+1);

    }
    if (numar==1)
        numar=2;
    return numar;
}

int main()
{
    ciur_fct();
    f >> n;
    for (int i=1; i<=n; i++)
    {
        suma=1;
        f >> x;
        g << numar_div(x) <<' ';
        g << suma <<'\n';

    }
    return 0;
}