Cod sursa(job #2571739)

Utilizator spartanul300Vasile Andrei spartanul300 Data 5 martie 2020 09:51:57
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>
#define mod 9973

using namespace std;

ifstream f("ssnd.in");
ofstream g("ssnd.out");

long long ridicare_putere(long long baza,long long exp)
{
    if(exp==0)return 1;
    else if(exp==1)return baza;
    else
    {
        if(exp%2==1)return ((baza*ridicare_putere(baza,exp-1)%mod)%mod);
        else return (ridicare_putere((baza*baza)%mod,exp/2)%mod);
    }
}

long long nr_divizori,prod1,prod2,suma_divizori,d,t,Q,q,n,prim[1000010];
bool ciur[1000010];

int main()
{
    ciur[0]=ciur[1]=1;
    for(d=2;d<=1000000;d++)
    {
        if(ciur[d]==0)
        {
            t++;
            prim[t]=d;
            for(long long i=d*d;i<=1000000;i+=d)
                ciur[i]=1;
        }
    }


    f>>Q;
    for(int q=1;q<=Q;q++)
    {
        f>>n;

        d=1;nr_divizori=1;prod1=1;prod2=1;
        while(prim[d]*prim[d]<=n)
        {

            if(n%prim[d]==0)
            {
                int putere=0;
                while(n%prim[d]==0)putere++,n/=prim[d];

                nr_divizori*=(putere+1);
                prod1 = (prod1*(ridicare_putere(prim[d],putere+1)%mod-1)%mod)%mod;
                prod2 = (prod2*(prim[d]-1)%mod)%mod;
            }
            d++;
        }
        if(n!=1)
        {
            nr_divizori*=2;
            prod1 = (prod1*(n*n-1)%mod)%mod;
            prod2 = (prod2*(n-1))%mod;
        }

        suma_divizori=(prod1*ridicare_putere(prod2,mod-2)%mod)%mod;
        g<<nr_divizori<<" "<<suma_divizori<<'\n';
    }


    return 0;
}