Cod sursa(job #2287034)

Utilizator BotzkiBotzki Botzki Data 21 noiembrie 2018 13:22:46
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.04 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
const int MOD=9973;
const int NMAX= 1000007;
//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;
//vom genra sirul lui ratostene pana la 10^6, pentru a afla direct divizorii primi si a mai salva din timpul de executie
vector <int>prim;
bool vprim[NMAX+5];
void ciur_erathostene()
{
    int i, j;
   for(i=2;i<=NMAX;i++)
   {
       if(vprim[i]==0)
       {
           prim.push_back(i);
           for(j=i+i;j<=NMAX;j=j+i)
              vprim[j]=1;
       }
   }
}
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)
{
    nr=1;
    numarator=numitor=1;
    int e=0, ind=0;
    long long aux, d;
    d=prim[ind];
    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;
        }
        ind++;
        d=prim[ind];
    }
    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;
    ciur_erathostene();
    fin>>t;
    for(int i=1;i<=t;i++)
    {
       fin>>n;
       factori_primi(n);
       fout<<nr<<" ";
       fout<<p<<"\n";
    }

    return 0;
}