Cod sursa(job #2430847)

Utilizator mariasmmskklns mariasmm Data 16 iunie 2019 21:39:26
Problema Suma si numarul divizorilor Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <math.h>
#include <limits>
using namespace std;
const int nMax= 1000005;
bitset<nMax> prim;
void ciur (unsigned int n)
{
    for (unsigned int d=3; d*d<=n; d+=2)
        for (unsigned int j=3; d*j*d*j<=n; j+=2)
                if (d*j/2<nMax)
                    prim[d*j/2]=1;
}
int putere(int i, int j)
{
    int pi=1;
    j++;
    while (j--)
        pi*=i;
    return pi-1;
}
int main()
{
    ifstream f("ssnd.in");
    ofstream g("ssnd.out");
    unsigned int t,p;
    f>>t;
    vector <unsigned int> v;
    unsigned int maxi=0;
    for (unsigned int i=0; i<t; i++)
    {
        f>>p;
        v.push_back(p);
        if (p>maxi)
            maxi=p;
    }
    ciur(maxi);
    for (unsigned int i=0; i<t; i++)
    {
        unsigned int div=0, divi=1, nr;
        nr=v[i]; p=1;
        unsigned long long int s=1;
        while (nr%2==0)
        {
            div++;
            nr/=2;
        }
        if (div!=0)
        {
            p*=(div+1);
            s*=putere(2,div);
        }
        while ((nr!=1)&&(divi*2+1<=sqrt(nr)))
        {
            div=0;
            if (!prim[divi])
            {
                while (nr%(divi*2+1)==0)
                {

                    div++;
                    nr/=(divi*2+1);
                    if (nr%(divi*2+1)!=0)
                    {
                        p*=(div+1);
                        s*=(putere(divi*2+1,div)/(divi*2));
                    }
                }
                divi++;
            } else
            divi++;
        }
        if (nr>1)
            {
                p*=2;
                int c=(putere(nr,1)/(nr-1));
                s*=c;
            }
        g<<p<<" "<<s%9973;
        g<<"\n";
    }
    return 0;
}