Cod sursa(job #2130443)

Utilizator IsacLucianIsac Lucian IsacLucian Data 13 februarie 2018 18:10:33
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>
#define MOD 9973

using namespace std;

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

int Q,nrp[100000],k;
bitset<1000005>ciur;

void Generare()
{
    int i,j;
    ciur[1]=1;
    for(i=2;i*i<=1000000;i++)
        if(!ciur[i])
            for(j=i*i;j<=1000000;j+=i)
                ciur[j]=1;

    k=0;
    for(i=2;i<=1000000;i++)
        if(!ciur[i])nrp[++k]=i;
}

int Lgput_MOD(int a,int n)
{
    int p=1;
    while(n)
    {
        if(n%2)p=1LL*p*a%MOD;
        n/=2;
        a=1LL*a*a%MOD;
    }
    return p;
}

long long Lgput(long long a,long long n)
{
    long long p=1;
    while(n)
    {
        if(n%2)p=p*a;
        n/=2;
        a=a*a;
    }
    return p;
}

void Solutie(int n)
{
    int i,d,nrdiv,sum,x;
    sum=nrdiv=1;

    for(i=1;nrp[i]<=n && i<=k;i++)
        if(n%nrp[i]==0)
        {
            x=n;
            d=0;
            while(x%nrp[i]==0)
            {
                d++;
                x/=nrp[i];
            }

            nrdiv=nrdiv*(d+1);
            sum=(1LL*sum*(Lgput(nrp[i],(d+1))-1)*Lgput_MOD((nrp[i]-1),MOD-2)%MOD)%MOD;
        }

    fout<<nrdiv<<" "<<sum<<"\n";
}
int main()
{
    Generare();
    fin>>Q;
    while(Q--)
    {
        int x;
        fin>>x;
        Solutie(x);
    }

    fin.close();
    fout.close();
    return 0;
}