Cod sursa(job #2431001)

Utilizator mariasmmskklns mariasmm Data 17 iunie 2019 17:21:30
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.12 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <math.h>
const int mod=9973;
using namespace std;
const int nMax= 500005;
bitset<nMax> prim;
int priml[100000];
void ciur ()
{
    int i=1;
    for (unsigned int d=3; d<=1e6; d+=2)
    {
        if (!prim[d/2])
        {
            priml[i]=d;
            i++;
        }
        for (unsigned int j=3; d*j<=1e6; j+=2)
                    prim[d*j/2]=1;
    }
}
int suma (int p, int d)
{
    long long s2=1;
    while (d+1)
    {
        s2*=p;
        d--;
    }
    s2--;
    s2/=(p-1);
    return s2;
}
int main()
{
    ifstream f("ssnd.in");
    ofstream g("ssnd.out");
    unsigned int t;
    f>>t;
    ciur();
    priml[0]=2;
    for (unsigned int i=0; i<t; i++)
    {
        unsigned int div=0, p=1, divi2=0;
        unsigned long long int s=1, nr;
        f>>nr;
        while ((nr!=1)&&(priml[divi2]<=sqrt(nr)))
        {
            if (nr<1e6 && nr%2==1)
                if (!prim[nr/2])
                    break;
            div=0;
            int divizor=priml[divi2];
                while (nr%divizor==0)
                {

                    div++;
                    nr/=divizor;
                    if (nr%(divizor)!=0)
                    {
                        if (div==1)
                            {
                                p*=2;
                                s*=(divizor+1);  //4536
                                s%=mod;
                            }
                                    else
                        if (div>1)
                        {
                            long long c;
                            p*=(div+1);
                            c=suma(divizor,div);
                            c%=mod;
                            s*=c;
                            s%=mod;
                        }
                    }
                }
            divi2++;
        }
        if (nr>1)
            {
                p*=2;
                s*=(nr+1);
            }
        g<<p<<" "<<s%mod;;
        g<<"\n";
    }
    return 0;
}