Cod sursa(job #2713995)

Utilizator Amelia_MilcuMilcu Amelia Amelia_Milcu Data 1 martie 2021 06:57:36
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#define NMAX 1000000
#define MOD 9973
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
bool c[NMAX+3];
int n,x,k,p[NMAX/2+3],v[NMAX+3];
int lgp(int a,int b)
{
    if(b==0)
        return 1;
    int x=lgp(a,b/2);
    if(b%2==1)
        return a*x*x%MOD;
    return x*x%MOD;
}
int main()
{
    c[0]=c[1]=1;
    for(int i=2;i<=NMAX;i++)
    {
        if(!c[i])
        {
            p[++k]=i;
            for(int j=i*2;j<=NMAX;j+=i)
                c[j]=1;
        }
    }
    for(int i=1;i<=k;i++)
        v[p[i]]=lgp(p[i]-1,MOD-2);
    fin>>n;
    for(;n--;)
    {
        fin>>x;
        int nrd=1,s=1;
        for(int i=1;i<=k && p[i]*p[i]<=x;i++)
            if(x%p[i]==0)
            {
                int exp=0;
                while(x%p[i]==0)
                    exp++,x/=p[i];
                nrd*=(exp+1);
                int y=lgp(p[i],exp+1)+MOD-1;
                if(y>=MOD)
                    y-=MOD;
                s=(((s*y)%MOD)*v[p[i]])%MOD;
            }
        if(x!=1)
            nrd*=2,s=1LL*s*(x+1)%MOD;
        fout<<nrd<<" "<<s<<"\n";
    }
    return 0;
}