Cod sursa(job #2373822)

Utilizator vladsirbu23Vlad Sirbu vladsirbu23 Data 7 martie 2019 15:26:25
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>
#include <vector>
#define m 9973
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
long long ciur[1000010];
vector <long long> v;
long long putere(long long n, long long k)
{
    long long x;
    if(k==1)
        return n;
    else
    {
        if(k%2==0)
        {
            x=putere(n,k/2)%m;
            return (x*x)%m;
        }
        else
        {
            x=putere(n,(k-1)/2)%m;
            return (x*x*n)%m;
        }
    }
}
int main()
{
    long long T,n,k,nr,nrdiv=1,sumdiv=1,p,i,j,nrpr;
    fin>>T;
    v.push_back(0);
    ciur[1]=1;
    for(i=2; i<=1000000; i++)
    {
        if(ciur[i]==0)
        {
            v.push_back(i);
            for(j=2*i; j<=1000000; j=j+i)
                ciur[j]=1;
        }
    }
    nrpr=v.size()-1;
    while(T!=0)
    {
        T--;
        fin>>n;
        k=0;
        nrdiv=1;
        sumdiv=1;
        while(n!=1&&v[k]*v[k]<=n&&k<=nrpr)
        {
            k++;
            nr=0;
            while(n%v[k]==0)
            {
                n=n/v[k];
                nr++;
            }
            if(nr!=0)
            {
                nrdiv=nrdiv*(nr+1);
                p=(putere(v[k]%m,nr+1)%m+m-1)%m;
                sumdiv=(sumdiv*(p%m))%m;
                sumdiv=(sumdiv*(putere(v[k]-1,m-2)%m))%m;
            }
        }
        if(n!=1)
        {
            nr=1;
            nrdiv=nrdiv*(nr+1);
            p=(putere(n%m,nr+1)%m+m-1)%m;
            sumdiv=(sumdiv*(p%m))%m;
            sumdiv=(sumdiv*(putere(n-1,m-2)%m))%m;
        }
        fout<<nrdiv<<" "<<sumdiv<<'\n';
    }
}