Cod sursa(job #2692326)

Utilizator MateGMGozner Mate MateGM Data 2 ianuarie 2021 12:27:37
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

ifstream be("ssnd.in");
ofstream ki("ssnd.out");
int MOD=9973,nmax=1e6;

vector<bool>a((nmax)/2+1,true);
int hanyprim=0;
void szita()
{
    a[0]=false;
    for(int i=1;i<=nmax/2;i++)
    {
        if(a[i]==true){
            hanyprim++;
            int prim=2*i+1;
            for(int j=3;prim*j<=nmax;j+=2)
                a[(prim*j)/2]=false;
        }
    }


}

long long hatvany(long long n,long long p)
{
    if(p!=0){
        long long x=hatvany(n,p/2);
        if(p%2==0){

            return (x*x);
        }
        else{
            return ((x*x)*n);
        }
    }else return 1;

}

int main()
{
    int m;
    long long n;
    be>>m;
    szita();
    vector<int>prim(hanyprim+1);
    int k=1;
    prim[0]=2;
    for(int i=1;i<=nmax/2;i++)
    {
        if(a[i]==true)
            prim[k++]=2*i+1;
    }
    for(int i=0;i<m;i++){
        be>>n;
        long long db=1,db1=1;
        for(int i=0;i<k && n>=prim[i]*prim[i];i++){
            int j=0;
            int p=prim[i];
            if( n%p==0)
            {
                while(n%p==0)
                {
                    j++;
                    n=n/p;
                }
                db=(db*(j+1))%MOD;
                db1=(db1*((hatvany(p,j+1)-1)/(p-1)%MOD))%MOD;
            }
        }
        if(n>1)
        {
            db=db*2%MOD;
            db1=db1*((hatvany(n,2)-1)/(n-1)%MOD)%MOD;
        }
        ki<<db<<" "<<db1<<'\n';
    }

    return 0;
}