Cod sursa(job #2195039)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 14 aprilie 2018 23:02:59
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

const long long MOD=9973;
const long long RAD=1234567;

bool prime[RAD+5];
long long prim[RAD+5],y=0;

void build()
{
    long long i,j;
    for(i=2;i<=RAD;i++)
        prime[i]=1;
    for(i=4;i<=RAD;i+=2)
        prime[i]=0;
    for(i=3;i*i<=RAD;i+=2)
        if(prime[i]==1)
            for(j=i*i;j<=RAD;j+=i)
                prime[j]=0;
    for(i=1;i<=RAD;i++)
        if(prime[i]==1)
            prim[++y]=i;
}


void slove(long long x)
{
    long long cnt=1,sum=1;
    long long p=1;
    while(prim[p]*prim[p]<=x)
    {
        bool e=0;
        long long val=prim[p],cate=1;
        while(x%prim[p]==0)
        {
            e=1;
            x/=prim[p];
            val*=prim[p];
            cate++;
        }
        if(e==1)
        {
            sum*=(val-1)/(prim[p]-1);
            sum%=1LL*MOD;
            cnt*=cate;
        }
        p++;
    }
    if(x>1)
    {
        cnt*=2;
        sum*=(x*x-1)/(x-1);
        sum%=1LL*MOD;
    }
    fout<<cnt<<" "<<sum<<"\n";
}

int main()
{
    build();
    long long t;
    fin>>t;
    while(t--)
    {
        long long a;
        fin>>a;
        slove(a);
    }
    return 0;
}