Cod sursa(job #431305)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 31 martie 2010 20:40:40
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>

using namespace std;
long long m,numar,n,set,t,i,j;
int a[100000];
long long prod_sus,prod_jos,prod;
bool prim[1000000];
long long x,nr;
long long putere(long long  num,long long p)
{
    long long i,sol=1;
    for(i=0;(1<<i)<=p;++i)
    {
        if (((1<<i)&p)>0) sol=(sol*num);
        num=(num*num);
    }
    return sol;
}
int main()
{
    long long p;
    ifstream fi("ssnd.in");
    ofstream fo("ssnd.out");
    m=9973;
    n=0;
    for(i=2;i<=1000000;i++)
       if(!prim[i]) { a[++n]=i; for(j=2*i;j<=1000000;j+=i) prim[j]=1; }
    fi>>t;
    for(set=1;set<=t;set++)
    {
       fi>>nr;
       //x=(int)sqrt(nr);
       prod_sus=1; numar=1;
       prod_jos=1; prod=1;
       i=1;
       x=nr;
       for(i=1;i<=n&&a[i]<=x/2;i++)
       if(nr%a[i]==0)
       {
           p=0;
           while(nr%a[i]==0) { nr/=a[i]; p++; }

           prod_sus=putere(a[i],p+1)-1;
           prod_jos=a[i]-1;
           prod=(prod*(prod_sus/prod_jos)%m)%m;
           numar*=(p+1);
       }


       if(numar==prod==1) fo<<"2 "<<(nr+1)%m<<"\n"; else
       fo<<numar<<" "<<prod<<"\n";
    }
    fo.close();
    return 0;
}