Cod sursa(job #2286830)

Utilizator BotzkiBotzki Botzki Data 20 noiembrie 2018 21:13:48
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>

using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
const int MOD=9973;
//STIM CA n = f1^e1 + f2^e2 +...+ fk^ek
//NR DIVIZORILOR = (e1+1) * (e2+1) * ... *(ek+1)
//SUMA DIVIZORILOR (p1^(d1+1)-1)/(p1-1) * p2^(d2+1)-1)/(p2-1) * ... * pk^(dk+1)-1)/(pk-1)
//nr divizorilor
long long nr=1;
//suma divizorilor
long long numitor=1, numarator=1, p;
long long lg_putere(int a, int b)
{
    long long p=1;
   while(b>0)
   {
      if(b&1)
        p = (p *(a%MOD))%MOD;
      a = ((a%MOD) *(a%MOD))%MOD;
      b=b>>1;
   }
   return p;
}
void factori_primi(long long n)
{
    long long d=2;
    nr=1;
    numarator=numitor=1;
    int e=0;
    long long aux;
    while(d*d<=n and n>1)
    {
        e=0;
        while(n%d==0)
        {
            e++;
            n=n/d;
        }
        if(e>0)
        {
           nr=(nr*(e+1))%MOD;
           aux=lg_putere(d, e+1);
           numarator = (numarator * ( (aux-1) % MOD )) %MOD;
           numitor = (numitor * ( (d-1) %MOD ))%MOD;
        }
        d++;
    }
    if(n>1)
    {
        nr=(nr*2)%MOD;
        aux=lg_putere(n, 2);
        numarator = (numarator * ( (aux-1) % MOD )) %MOD;
        numitor = (numitor * ( (n-1) %MOD ))%MOD;
    }
    //numitorul va fi invers modular
    numitor = lg_putere(numitor, MOD-2);
    p = (numarator*numitor)%MOD;
}
int main()
{
    long long n;
    int t;
    fin>>t;
    for(int i=1;i<=t;i++)
    {
       fin>>n;
       factori_primi(n);
       fout<<nr<<" ";
       fout<<p<<"\n";
    }

    return 0;
}