Cod sursa(job #1095171)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 30 ianuarie 2014 15:30:36
Problema Suma si numarul divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <bitset>
#include <vector>
#define Nmax 1000000
#define pb push_back
#define X 9973
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");

int T,nr,S,P[100000];
long long N;
bitset < Nmax+10> v;

void Ciur()
{
     P[++P[0]]=2;
     for(int i=4;i<=Nmax;i+=2)v[i]=1;
     for(int i=3;i<=Nmax;i+=2)
          if(!v[i])
          {
               P[++P[0]]=i;
               if(1LL*i*i<=Nmax)
                 for(int j=i*i; j<=Nmax;j+=i)v[j]=1;
          }
}

int Putere(int N,int K)
{
     if(!K)return 1;
     int M=1;
     while(K!=1)
          if(K%2==0)N=(N*N)% X,K/=2;
               else M=(M*N)% X,--K;
     return (M*N) % X;
}

void SSND(long long N,int &S,int &nr)
{
     S=nr=1;
     for(int i=1;i<=P[0] && N!=1 ; ++i)
        if( N % P[i]==0)
        {
             int k=0;
             while(N % P[i]==0)N/=P[i],++k;
             nr*=(k+1);
             int aux=(Putere(P[i],k+1)-1+X) % X;
             aux= (aux * Putere(P[i]-1,X-2))% X;
             S= (S * aux) % X;
        }
     if(N>1)
     {
          nr*=2;
          int aux=(Putere(N,2)-1+X)  % X;
          aux= (aux * Putere(N-1,X-2))% X;
          S= (S * aux) % X;
     }
}

int main()
{
     Ciur();
     f>>T;
     for(int t=1;t<=T;++t)
     {
          f>>N;
          SSND(N,S,nr);
          g<<nr<<' '<<S<<'\n';
     }
     f.close();g.close();
     return 0;
}