Cod sursa(job #2050121)

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

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

ifstream f("ciur.in");
ofstream g("ciur.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] == n*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 = n;
    for(int i = 0; prim[i] <= n; 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;
            cout<<rez<<" "<<invmod<<"\n";
            s *= (((rez - 1) % MOD) * invmod) % MOD;
        }
        nrdiv = nrdiv * (1+e);
    }
}


int main()
{
    cin>>n;
    fciur();
    div();
    cout<<nrdiv<<" "<<s;
    return 0;
}