Cod sursa(job #2195035)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 14 aprilie 2018 22:53:53
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

const int MOD=9973;
const int RAD=1000000;

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

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


void slove(long long x)
{
    long long cnt=1,sum=1;
    int p=1;
    while(prim[p]*prim[p]<=x)
    {
        int val=prim[p],cate=1;
        while(x%prim[p]==0)
        {
            x/=prim[p];
            val*=prim[p];
            cate++;
        }
        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();
    int t;
    fin>>t;
    while(t--)
    {
        int a;
        fin>>a;
        slove(a);
    }
    return 0;
}