Cod sursa(job #2432975)

Utilizator gruhtenZinnenberg Gruhten gruhten Data 25 iunie 2019 16:44:18
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <cmath>
#include <bitset>
using namespace std;
const int dim=1200000;
const int MOD=9973;
bitset <dim>a;
//bool a[dim];
int prime[80000];

long long sumd (int a, int b)
{
    int i;
    long long P=a;
    for(i=1;i<=b;i++)
            P=P*1LL*a;
    P=(P-1)/(a-1);
    P=P%MOD;
}

int main()
{
    ifstream f("ssnd.in");
    ofstream g("ssnd.out");
    int n,x,i,j,nr=0;
    long long Sd=1,P,nrd=0,p=0;

    n=dim;
    x=sqrt(n);

    for(j=4;j<=n;j=j+2)
            a[j]=1;

    for(i=3;i<=x;i=i+2)
            if(a[i]==0)
                for(j=i*i;j<=1000002;j=i+j)
                    a[j]=1;
    a[0]=1;
    a[1]=1;

    prime[1]=2;
    nr=1;
    for(i=3;i<=1000002;i=i+2)
        if(a[i]==0)
            prime[++nr]=i;

   /**********************************************/
//   g<<nr<<'\n';
//   for(i=1;i<=nr;i=i++)
//        g<<prime[i]<<'\n';
   /**********************************************/

    f>>n;

    for(j=1;j<=n;j++)
    {

    f>>x;
    nrd=1;
    Sd=1;
    p=0;
    while(x%2==0)
    {
        p++;
        x=x/2;
    }
    nrd=nrd*(p+1);
    if(p>0)
    {
        Sd=Sd*sumd(2,p);
    }

    for(i=1; prime[i]*prime[i]<=nr; i++)
    {
        if(x%prime[i]==0)
        {
            p=0;
            while(x%prime[i]==0)
                {p++; x=x/prime[i];}
            nrd=nrd*(p+1);
            Sd=Sd*sumd(prime[i],p);
        }
    }

    if(x>1)
    {
        nrd=nrd*2;
        Sd=Sd*sumd(x,1);
    }

    g<<nrd<<" "<<Sd%MOD<<'\n';

    }


    return 0;
}