Cod sursa(job #2280790)

Utilizator SergiuS3003Sergiu Stancu Nicolae SergiuS3003 Data 11 noiembrie 2018 10:20:04
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include  <fstream>
using namespace std;
const int m=9973;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
struct numere
{
    int nr,ex;

};
numere v[50];
long long int lv=0,nr;
void desc(long long int nr)
{
    long long int p=0;
    lv=0;
    if(nr%2==0)
    {
        while(nr%2==0)
        {
            p++;
            nr/=2;
        }
        v[1].nr=2;
        v[1].ex=p;
        lv++;
    }
    for(int i=3; i*i<=nr; i+=2)
    {
        p=0;
        if(nr%i==0)
        {
            while(nr%i==0)
            {
                nr/=i;
                p++;
            }
            v[++lv].nr=i;
            v[lv].ex=p;
        }
    }
    if(nr>1)
    {
        v[++lv].nr=nr;
        v[lv].ex=1;
    }
}
long long powlg(long long int a,long long int b)
{
    long long int val=1;
    while(b!=0)
    {
        if(b%2==0)
        {
            a*=a;
            b/=2;
        }
        else
        {
            b--;
            val*=a;
        }
    }
    return val;
}
int main()
{
    long long int a,b,t,nr,i,s,nrdv=1;
    f>>t;
    for(i=1; i<=t; i++)
    {
        f>>nr;
        nrdv=1;
        s=1;
        desc(nr);
        for(int j=1; j<=lv; j++)
        {
            b=v[j].ex;
            b++;
            a=v[j].nr;
            nrdv*=b;

            long long int p=powlg(a,b);
            a--;
            p--;
            p/=a;

            s*=p;
            s%=m;
        }
        g<<nrdv<<" "<<s<<'\n';
    }

    return 0;
}