Cod sursa(job #2712422)

Utilizator stefantagaTaga Stefan stefantaga Data 25 februarie 2021 19:08:37
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>
#define MOD 9973
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
bitset <1000005> ciur;
long long i,j,t;
long long psus,pjos,n,d,p,numar;
vector <long long> nrprime;
long long ridput (long long a,long long b)
{
    if (b==0)
    {
        return 1;
    }
    long long rez=ridput(a,b/2);
    if (b%2==0)
    {
        return (rez*rez)%MOD;
    }
    return ((rez*rez)%MOD*a)%MOD;
}
long long inv (long long x)
{
    return ridput(x,MOD-2);
}
long long nrdiv;
int main()
{
    ciur[0]=ciur[1]=1;
    for (i=2;i<=1000000;i++)
    {
        if (ciur[i]==0)
        {
            nrprime.push_back(i);
            for (j=i*i;j<=1000000;j+=i)
            {
                ciur[j]=1;
            }
        }
    }
    f>>t;
    psus=pjos=1;
    for (;t--;)
    {
        f>>n;
        d=0;
        nrdiv=1;
        psus=pjos=1;
        while (d<nrprime.size()&&nrprime[d]*nrprime[d]<=n&&n!=1)
        {
            numar=0;
            p=1;
            while (n%nrprime[d]==0)
            {
                p=(p*nrprime[d])%MOD;
                n=n/nrprime[d];
                numar++;
            }
            if (numar>0)
            {
                p=(p*nrprime[d])%MOD;
                p=(p+MOD-1)%MOD;
                psus=(psus*p)%MOD;
                pjos=(pjos*inv(nrprime[d]-1))%MOD;
                nrdiv=nrdiv*(numar+1);
            }
            d++;
        }
        if (n!=1)
        {
            p=(n*n)%MOD;
            p=(p+MOD-1)%MOD;
            psus=(psus*p)%MOD;
            pjos=(pjos*inv(n-1))%MOD;
            nrdiv=nrdiv*2;
        }
        g<<nrdiv<<" "<<(psus*pjos)%MOD<<'\n';
    }
    return 0;
}